python学习笔记7--继承与魔法方法

类的特点 封装 继承 多肽(不常用)

#继承:一个类继承另一个类,就可以使用另一个类里的方法
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(搭积木)设计模式–>由分到总

魔法方法

#运算符方法参考+,__add__这种

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__)#以字典形式输出实例属性  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值