python 继承
Python 支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:
class 子类类名(父类 1[,父类 2,...]):
类体
如果在类定义中没有指定父类,则默认父类是 object 类。object 是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__()。
定义子类时,必须在其构造函数中调用父类的构造函数。调用格式:父类名.__init__(self, 参数列表)。
class Person:
def __init__(self,name,age):
self.name = name
self.__age = age #私有属性
def say(self):
print('姓名:{0},年龄:{1}'.format(self.name, self.__age))
# 继承父类
class Man(Person):
def __init__(self,name,age,sex):
Person.__init__(self,name,age) # 显示调用父类的构造方法
self.sex = sex
# 重写父类方法
def say(self):
print('姓名:{0},年龄:{1},性别:{2}'.format(self.name, self.age,self.sex))
super().say() #调用父类的方法
m = Man('张三',12,'男')
# 查看对象属性
print(dir(m))
print(m._Person__age) #父类的私有属性继承后,属性名为‘_Person__age’
m.say()
# 查看类的继承层次结构
print(Man.mro()) #[<class '__main__.Man'>, <class '__main__.Person'>, <class 'object'>]
object根类
object 类是所有类的父类,因此所有的类都有 object 类的属性和方法。我们显然有必要深入研究一下 object 类的结构。
obj = object()
print(dir(obj))
根类对象的属性有:
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
dir()查看对象属性
__str__(),用于返回一个对于“对象的描述”。
经常用于 print()方法,帮助我们查看对象的信息。
class Person:
def __init__(self,name,age):
self.name = name
self.__age = age #私有属性
def __str__(self):
return '姓名:{0},年龄:{1}'.format(self.name,self.__age)
p = Person('李四',18)
print(p)
多重继承
Python 支持多重继承,一个子类可以有多个“直接父类”。具备了“多个父类”的特点。这样会被“类的整体层次”搞的异常复杂,尽量避免使用。
class A:
print('class A')
def test(self):
print('test method A')
class B:
print('class B')
def test(self):
print('test method B')
class C(A,B):
print('class C')
c = C()
c.test()
多个父类中有同名的方法,执行顺序由继承父类的顺序决定,执行先继承的父类的方法。
super()获得父类定义
在子类中,如果想要获得父类的方法时,我们可以通过 super()
特殊方法和运算符重载
运算符实际上是通过调用对象的特殊方法实现的。
特殊属性
Python 对象中包含了很多双下划线开始和结束的属性,这些是特殊属性,有特殊用法。
对象的浅拷贝与深拷贝
浅拷贝
Python 拷贝一般都是浅拷贝。拷贝时,对象包含的子对象内容不拷贝。因此,源对象和拷贝对象会引用同一个子对象。
·深拷贝
使用 copy 模块的 deepcopy 函数,递归拷贝对象中包含的子对象。源对象和拷贝对象所有的子对象也不同。