15-多继承魔术方法

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

猜你喜欢

转载自www.cnblogs.com/tiantiancode/p/12899701.html