1.子类继承了父类的所有属性,如果重名,子类实例化的时候,先在自己这里找,如果找不到再去父类那里找
什么时候用继承
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好
当类之间有显著的不同,并且较小的类是较大的类所需要的组件的时候,用组合比较好。
继承同时具有两种含义
1 . 继承基类的方法,并且做出自己的改变或者扩展(代码重用)
2 . 声明某个子类兼容于某基类,定义一个接口类,子类继承接口类,并且实现接口中定义的方法,父类的目的是定义必须实现什么方法,来规范子类,接口类没必要实例化,只定义接口,不定义具体的实现,具体实现的定义在子类中。通过abc函数,子类必须实现父类定义的方法,如果不实现,就不能实例化。
class Dad:
'这个是爸爸类'
money = 10
def __init__(self,name):
print("爸爸")
self.name = name
def hit_son(self):
print("%s 正在打儿子" % self.name)
class Son(Dad):
money = 100
print(Son.money)
print(Dad.__dict__)
print(Son.__dict__)
s1 = Son("alex") #输出爸爸
print(s1.name)
print(s1.money)
print(s1.__dict__)
#结果
100
{'__module__': '__main__', '__doc__': '这个是爸爸类',
'money': 10, '__init__': <function Dad.__init__ at 0x00000000029A1E18>,
'hit_son': <function Dad.hit_son at 0x00000000029A1EA0>,
'__dict__': <attribute '__dict__' of 'Dad' objects>,
'__weakref__': <attribute '__weakref__' of 'Dad' objects>}
{'__module__': '__main__', 'money': 100, '__doc__': None}
爸爸
alex
100
{'name': 'alex'}
接口继承
class All_file:
def read(self):
pass
def write(self):
pass
class Disk(All_file):
def read(self):
print("disk read")
def write(self):
print("disk write")
class Cdrom(All_file):
def read(self):
print("Cdrom read")
def write(self):
print("Cdro write")
class Mem(All_file):
def read(self):
print("mem read")
m1 = Mem()
m1.read()
m1.write()
#结果
mem read
上面的代码的问题是,子类无法被父类限制,比如class Mem这个类,就没有write方法。因此要import abc模块
import abc
class All_file(metaclass=abc.ABCMeta):
@abc.abstractmethod #英文翻译,抽象的方法,说明这个方法不用具体的实现
def read(self):
pass
@abc.abstractmethod
def write(self):
pass
class Disk(All_file):
def read(self):
print("disk read")
def write(self):
print("disk write")
class Cdrom(All_file):
def read(self):
print("Cdrom read")
def write(self):
print("Cdro write")
class Mem(All_file):
def read(self):
print("mem read")
m1 = Mem()
# m1.read()
# m1.write()
#结果
raceback (most recent call last):
File "D:/nd/python全栈/Day25/接口继承.py", line 27, in <module>
m1 = Mem()
TypeError: Can't instantiate abstract class Mem with abstract methods write