(八)面向对象----(二)
目录
面向对象的三大特性----继承
8.1继承
一个类继承另一个类时,他将自动获得另一个类的所有属性和方法。
原有的类称为父类,或基类,超类
新生类称为子类,或派生类
8.2单继承和多继承
a.一个类 可以被多个类继承
b.一个类 可以继承多个父类
__bases__可以查找子类的父类,特例:没有继承父类,默认继承object,我们称为新式类
class A(object):pass # 父类
class B:pass
class A_son(A,B):pass # 子类
class AB_son(A):pass
print(A_son.__bases__)
print(AB_son.__bases__)
print(A.__bases__)
'''
(<class '__main__.A'>, <class '__main__.B'>)
(<class '__main__.A'>,)
(<class 'object'>,)
'''
8.3继承与重用性
创建两个对象一个Dog一个Cat
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def sit(self):
print(self.name.title() + 'is now sitting')
class Cat():
def __init__(self,name,age):
self.name = name
self.age = age
def climb(self):
print(self.name.title() + 'is now climbing')
我们发现有需多重复代码,使用继承的思想
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
class Dog(Animal):
def sit(self):
print(self.name.title() + ' is now sitting')
class Cat(Animal):
def climb(self):
print(self.name.title() + ' is now climbing')
dog = Dog('dog',2)
cat = Cat('cat',1)
print(dog.name)
print(cat.name)
'''
dog
cat
'''
8.4派生
父类中没有的属性 在子类中出现 叫做派生属性
父类中没有的方法 在子类中出现 叫做派生方法
只要是子类的对象调用,子类中有的名字 一定用子类的,子类中没有才找父类的,如果父类也没有就报错
如果父类 子类都有 用子类的
如果还想用父类的,单独调用父类的:
a.父类名.方法名 需要自己传self参数
b.super().方法名 不需要自己传self
派生属性:
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
class Dog(Animal):
def __init__(self,name,age,kind):
Animal.__init__(self,name,age)
self.kind = kind
dog = Dog('dog',2,'big dog')
print(dog.kind)
print(dog.name)
#big dog
#dog
派生方法:
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
class Dog(Animal):
def sit(self):
print(self.name.title() + ' is now sitting')
dog = Dog('dog',2)
dog.sit()
#Dog is now sitting
只要是子类的对象调用,子类中有的名字 一定用子类的,子类中没有才找父类的
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
def say(self):
print('我是动物')
class Dog(Animal):
def sit(self):
print(self.name.title() + ' is now sitting')
def say(self):
print('我是狗')
dog.say()
#我是狗
如果还想用父类的,单独调用父类的
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
def say(self):
print('我是动物')
class Dog(Animal):
def __init__(self,name,age,kind):
Animal.__init__(self,name,age)
self.kind = kind
def sit(self):
print(self.name.title() + ' is now sitting')
def say(self):
Animal.say(self) #父类名.方法名 需要自己传self参数
print('我是狗')
dog = Dog('dog',2,'big dog')
dog.say()
'''
我是动物
我是狗
'''
在python3中,子类执行父类的方法也可以直接用super方法
class Animal:
def __init__(self,name,age):
self.name = name
self.age = age
def say(self):
print('我是动物')
class Dog(Animal):
def __init__(self,name,age,kind):
super(Dog, self).__init__(name,age) #super().__init__() 不需要自己传self
self.kind = kind
def sit(self):
print(self.name.title() + ' is now sitting')
def say(self):
super(Dog, self).say() #super().方法名 不需要自己传self
print('我是狗')
dog = Dog('dog',2,'big dog')
print(dog.kind)
print(dog.name)
dog.say()
8.5钻石继承
相关连接:https://blog.csdn.net/zeroooorez/article/details/89527189
8.6抽象类与接口类
相关链接:https://blog.csdn.net/zeroooorez/article/details/89532827