Python:新式类写法,多继承
新式类写法:
经典类:不由任意内置类型派生出的类:
class A:
class Person:#父类 def eat(self): print("eat") class Man(Person):#子类 def sing(self):#派生类,拥有不同于父类的属性 print("sing")
class A():也属于经典类
class A(object(对象,Python为所有对象提供的基类,提供一些内置的属性和方法,所有类都继承,如果一个类没有继承任何类,默认继承object类)) 新式类:继承了object类或者该类的子类都是新式类,推荐使用
print(dir(object))
结果:
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
多继承:子类可以有多个父类,可以继承所有父类的属性和方法:
class Person(object):#父类 def eat(self): print("eat") class Person1(object):#第二个父类 def sing(self):#派生类,拥有不同于父类的属性 print("sing") class Son(Person,Person1): pass son=Son() son.eat() son.sing()
不同的父类存在同名的方法:开发时尽量避免这种情况:
class Person(object):#父类 def eat(self): print("eat") class Person1(object):#第二个父类 def eat(self): print("eat1")#不会被继承 def sing(self):#派生类,拥有不同于父类的属性 print("sing") class Son(Person,Person1): pass son=Son() son.eat() son.sing()
class Person(object):#父类 def eat(self): print("eat") class Person1(object):#第二个父类 def eat(self): print("eat1")#会被继承,因为Son类调用符合就近原则,Person1最近则被优先调用 def sing(self):#派生类,拥有不同于父类的属性 print("sing") class Son(Person1,Person): pass son=Son() son.eat() son.sing()
方法的搜索顺序(了解):__mro__:
class Person(object):#父类 def eat(self): print("eat") class Person1(object):#第二个父类 def eat(self): print("eat1") def sing(self):#派生类,拥有不同于父类的属性 print("sing") class Son(Person1,Person): pass son=Son() son.eat() son.sing() print(Son.__mro__) 结果为: eat1 sing (<class '__main__.Son'>, <class '__main__.Person1'>, <class '__main__.Person'2>, <class 'object'>) 搜索方法时会先按照__mro__的输出结果从左往右的顺序查找,如果在当前类中找到方法就会直接运行不会搜索,没找到会报错