# 类的特点 封装 继承 多肽(不常用)
#继承:一个类继承另一个类,就可以使用另一个类里的方法
eg
class Father1:
def hello(self):
print('hello')
class Father(object):#object->Father->son
def __init__(self,name):#父类的属性高于两个子类
self.name=name
def eat(self):
print('大吃一顿')
class Son1(Father,Father1):#继承Father类,可同时继承多个父类
name='小黑'
class Son2(Father):#继承中,访问的顺序逐层son->father->object
name='小白'
son1=Son1('小白')
son2=Son2('小黑')
print(son1.name)
son1.eat()
son1.hello()
print(Father.__bases__)#__bases__查询其父类名
print(son2.name)
son2.eat()
#如果继承多个父类 父类中有同种方法 会优先继承最左变得类
#继承优先级 由左到右
class Father:
def __init__(self,name):
self.name=name
def eat(self):
print("大吃一顿")
class Mother:
def __init__(self,age,sex):
self.age=age
self.sex=sex
def cook(self):
print('炒菜好吃%s'%self.age)
class son(Father,Mother):
pass
xiaohong=son('name')#此时参数不会传入Mother中
print(xiaohong.name)
xiaohong.eat()
xiaohong.age='age'#可使用此方法向Mother传参
print(xiaohong.age)
xiaohong.cook()
class Base:
def play(self):
print('this is base')
class A(Base):
def play(self):
print('this is A')
super().play()#调用B,
class B(Base):
def play(self):
print('this is B')
class Son(A,B):
def play(self):
print('this is Son')
Base().play()#可用于调用父类
super().play()#super.方法()调用父类的方法 遵循mro规则
#mro 算法解析顺序 继承的顺序,
s=Son()#实例化Son,mro规则顺序为:A->B-Base->object
s.play()
print(Son.__mro__)#通过此语句可以查看mro顺序
A().play()
#在使用类里方法的时候 有两种形式
#1,实例化一个对象 通过对象.方法()
#2,类名().方法() #类名() 实例化
#不想使用父类方法,可在子类中重写进行覆盖
#多继承 Mix-in(搭积木)设计模式-->由分到总
# 魔法方法
#运算符方法参考+这种
class A:
def __init__(self,num1,num2):
self.num1=num1
self.num2=num2
def __add__(self,other):#由+号调用
sum1=self.num1+other.num2
sum2=self.num2+other.num1
return sum1,sum2
print(sum1)
a=A(10,100)
b=A(11,111)
print(a+b)
print(1+2)
# str 和 repr (必须返回字符串)
#print 直接打印对象时,会显示object和地址
#如果定义了repr,print打印时会打印这个魔法方法里的内容
#如果定义了str就会打印str里的内容
#str和repr同时出现,只会打印str里的内容
class Person:
def play(self):
print('this is play')
def __str__(self):
return 'this is str'
def __repr__(self):
return 'this is repr'
x=Person()
x.play()
# %s 占位符 %r也是占位符
# %s 会调用str %r会调用repr
print('%s'%x)#打印时默认为str
print('%r'%x)#交互时默认为repr
# __str__返回的结果 可读性强 方便阅读者
# __repr__返回的结果更精确 方便开发者
# __call__方法
class Person:
#实例变量加上括号就可以调用__call__
def __call__(self):
print('this is call')
h=Person()
h.age=19
h()
print(h.__class__)#查询类名
print(h.__dict__)#以字典形式输出实例属性