01 继承和多继承
1,继承
class A(): # 这是父亲类
def hello(self):
print("我是父类")
class B(A): # 我是儿子类,继承了父类的性格
def __init__(self):
print("我是子类")
ss = B() # 实例化B
ss.hello() # 调用了父亲的类
可以看到,在定义B类的时候,括号里面加了个A,这样就写成了一个继承类,B是A的儿子,B继承了A的一切。B可以随时调用它的父亲A里面的函数。这就是继承的语法,需要注意的是,所有的类都是object的子类。
单继承和多继承:
单继承:每个类只能继承一个类
多继承:每个类允许继承多个类
class Fish(): #定义一个鱼类,会游泳
def __init__(self,name):
self.name = name
def swim(self):
print(self.name)
print("我会游泳")
class Bird(): # 定义了一个鸟类,会飞
def __init__(self, name):
self.name = name
def fly(self):
print(self.name)
print("我会飞")
class person(): # 定义了一个人类,会工作
def __init__(self, name):
self.name = name
def work(self):
print(self.name)
print("我会工作")
class SuperMan(person, Bird, Fish): # 超人,要会工作,会游泳,会飞
def __init__(self, name):
self.name = name
s = SuperMan("我是超人")
s.fly()
s.work()
s.swim()
print(SuperMan.mro) # 查看所有继承关系的方法
print(SuperMan.__base__) # 查看继承的父类 <class '__main__.person'>
print(SuperMan.__bases__) # 查看继承的全部父类 (<class '__main__.person'>, <class '__main__.Bird'>, <class '__main__.Fish'>)
这里定义了一个超人,那么既然是超人,那就要会飞,会游泳,会做人类做的事,所以很形象的解释出了一个关于多继承的例子
只要继承了一个父亲类,那么我们可以随时调用父亲里面的函数,子类继承是有顺序的,它会按照顺序来查看。关于多继承,我们不推崇这种写法,隐患很多,一旦出了bug,那么很难找出来。
2,组合
类里面还有一种写法,叫组合:
class Milk():
def __init__(self, x):
self.num = x
class Porridge():
def __init__(self, x):
self.num = x
class breakfast():
def __init__(self, x, y):
self.milk = Milk(x)
self.porridge = Porridge(y)
def name(self):
print("我今天早餐喝了{}杯牛奶,{}碗粥".format(self.milk.num, self.porridge.num))
ss = breakfast(2,3)
# print(ss) # <__main__.breakfast object at 0x000000000240ADA0> 直接print实例对象得到对象地址
ss.name()
#我今天早餐喝了2杯牛奶,3碗粥
这就是组合,直接把需要的类放进去实例化就可以了。
如果想扩展父类的构造函数,那么就有这个写法:
class B():
def __init__(self, name):
print("B")
print(name)
class C(B):
def __init__(self, name):
B.__init__(self, name) # 首先调用父类的构造函数
print("这是C中附加的功能") # 其次再增加自己的功能
c = C("我是C")
# B
# 我是C
# 这是C中附加的功能
--------------------------------super().f()
02 魔术方法
str__,repr,:芭蕾的实力变成字符串
__str:字符串,对用户友好,适合print输出
__repr:str备胎,如果有str,print会先执行str,eval(repr(object)) = object
call:正常情况下实例不能像函数一样被调用,要想的话可以用call
class:查看类名