lesson15多继承魔术方法
#视频1:作业回顾
#视频2:解答
------------------------------------------------
#视频3 继承
1 class Rectangle(object): 2 def __init__(self,wide,length): 3 self.wide =wide 4 self.length=length 5 6 def sear(self): 7 print('矩形面积是%s'%(self.length*self.wide)) 8 def add_length(self): 9 print('矩形周长是%s' % (self.length*2 + self.wide*2)) 10 11 #继承 12 class Suqare(Rectangle): 13 def __init__(self,wide,length): #子类重写父类方法 14 if wide==length: 15 # self.length=length #自己重写 16 # self.wide=wide 17 18 # super().__init__(wide,length) #方法1 调用父类方法 19 Rectangle.__init__(self,wide,length) #方法2 调用父类方法 20 print('进行初始化') 21 else: 22 #self.length=length #如果需要调用父类方法rear(),子类则需要重写方法 23 #self.wide=wide 24 print('传入的长宽不等,不进行初始化') 25 pass 26 27 su1=Suqare(10,10) 28 su1.sear() 29 su2=Suqare(10,12) 30 #su2.add_length() #这里不能调用,因为子类重写了父类,但子类没有重写self.wide=wide 31 32 print(Suqare.__base__) #查看父类 33 print(Suqare.__bases__) # 查看所有父类
#运行:
进行初始化
矩形面积是100
传入的长宽不等,不进行初始化
<class '__main__.Rectangle'>
(<class '__main__.Rectangle'>,)
------------------------------------------------
#视频5 多继承
1 class Base: 2 def func(self): 3 print('-------base----func--------------') 4 5 class A(Base): 6 def func_a(self): 7 print('-------a----func_a--------------') 8 def func(self): 9 print('-------a----func--------------') 10 11 class B(Base): 12 def func_b(self): 13 print('-------b----func_b--------------') 14 def func(self): 15 print('-------b----func--------------') 16 17 class C(A,B): 18 def func(self): 19 print('-------c----func--------------') 20 B.func(self) #定位找 21 super().func() # 找的顺序:自己--A---B---BASE 22 23 c =C() 24 25 c.func() #相同函数名 找的顺序:自己--A---B---BASE 26 # c.func_a() 27 # c.func_b() 28 29 print(C.__bases__) # 查看所有父类 30 print(C.mro()) #查看调用顺序列表
#运行:
-------c----func--------------
-------b----func--------------
-------a----func--------------
(<class '__main__.A'>, <class '__main__.B'>)
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]
传统模式继承
动物--人--男人、女人
mix-in模式(模块化)
胳膊、脑袋、腿----人 (多继承)
------------------------------------------------------------------------
#视频6 魔术方法
1 class MyStr(object): 2 def __init__(self,name): 3 self.name=name 4 5 def __add__(self,other): 6 new_name = self.name+other.name 7 print('对象之间使用了+,%s'%new_name) 8 9 st = MyStr('yan') 10 st1 = MyStr('zhi') 11 12 st+st1
#运行:
对象之间使用了+,yanzhi
--------------------------------------
# 案例2
1 class MyClass(object): 2 def __init__(self,wide,length): 3 self.wide=wide 4 self.length=length 5 6 def __str__(self): #给用户者 7 return '--str---%s'%self.wide 8 9 def __repr__(self): #给开发者 10 return '--repr---%s'%self.length 11 12 def __call__(self, *args, **kwargs): #有str就调用str方法,没有则调用repr方法 13 print('%s像函数一样调用了'%self) 14 15 a =MyClass(10,33) 16 17 print(a) #打印wide 10 调用__str__ 魔术方法 18 19 a #打印length 33 调用__repr__魔术方法 ,交互模式下 20 21 a() #调用__call__ 22 23 print(str.__dict__) #查看全部属性,返回属性和属性值键值对形式 24 print(str.__class__) #查看类名 25 print(str.__doc__) #查看对象文档,即类中(用三个引号引起来的部分) 26 print(str.__bases__) #查看父类 27 print(str.__mro__) #查看多继承的情况下,子类调用父类方法时,搜索顺序
小知识:在pythoncharm中 点run菜单中的铅笔--点show(打勾)--进入交互模式
#交互模式下运行:
a #输入
--repr---33
print(a) #输入
--str---10
--str---10像函数一样调用了 #调用call
--------------------------------------
# 继承魔术方法作业
1 #继承魔术方法作业 2 # 定义正方形类,继承与昨天的矩形类 3 # 要求: 1.实现类实例的可像函数一样被调用, 调用时打印边长; 4 # 2.实现类的实例之间可以用 + (加法),返回的结果是两个实例边长相加的结果 5 class Rectangle(object): # 继承魔术方法作业 6 def __init__(self,wide,length): 7 self.wide =wide 8 self.length=length 9 10 def sear(self): 11 s =self.length*self.wide 12 print('矩形面积是%s'%s) 13 14 class Square(Rectangle): 15 def __init__(self,wide,length): 16 if wide==length: 17 super().__init__(wide,length) #调用父类初始化方法 18 def __call__(self, *args, **kwargs): 19 print('正方形边长:%s'%self.wide) 20 21 def __add__(self, other): 22 add_wide = self.wide+other.wide 23 print('两个实例边长相加的结果:%s'%add_wide) 24 return add_wide 25 26 s1 = Square(10,10) 27 s2 = Square(20,20) 28 s1() 29 sum=s1+s2 30 print(sum)
#运行:
正方形边长:10
两个实例边长相加的结果:30
30