Tips:
面向对象的三大特点:封装、继承和多态。
一、继承
class Pig(object): # object 也是一个类 所有类的父类 这就是继承。如果类名后不带括号,就是继承父类
# 查看object类,按住Ctrl后鼠标左键点
pass # 继承的语法就是在定义类的时候,在类名后面括号中填入父类的类名
class Father:
money = '1个亿'
def __init__(self,name):
self.name = name
class Mother:
beautiful = '10分' # 属性 特征
def cook(self): # 方法 行为
print('老妈烧的一手好菜')
class Son(Father,Mother): # 继承的好处:父类的属性和方法,子类都可以直接使用
def __init__(self,name):
self.name = name
二、多继承
def cook(self): # 方法的重写 覆盖掉原来父类的方法
print('%s炒菜吃饭,吃中毒了'%self.name)
# 子类重写之后要调用父类的方法
# self.cook() # 想要重新使用父类的方法,不能用实例名.方法,这样做调用的其实是自己
Mother.cook(self) # 1 通过类名直接调用方法
super().cook() # 2 用super()去调用方法 只会调用一次(从最顶级类找,找到1个就停止)
可以多继承:
# 1 所有父类的属性和方法,子类都可以使用。
# 2 继承查找的顺序是:从左到右
son = Son('小张') # 初始化的时候,如果父类有多个参数,儿子调用时必须也传参数
print(son.money)
print(Son.__bases__) # 类名.__base__ 特殊属性 作用是查看类的直接父类(基类)
# 访问类的属性或方法-->类 中找-->直接基类(父类) 中找-->间接基类(object类)-->还找不到的话,就报错。
son.cook()
print(Son.__mro__) # 类名.__mro__ 特殊属性,不是私有属性,作用查看类的继承顺序
三、魔术方法
class A:
def __init__(self,num):
self.num = num
def __add__(self, other): # 这个是魔术方法 other是另一个方法
sum = self.num + other.num
return sum
a = A(2)
b = A(518)
print(a+b) # 触发这个add魔术方法
class Base:
def __str__(self): # 魔术方法 这个str魔术方法必须写返回值,必须是字符串
print()
return '帅帅帅'
def __repr__(self): # 魔术方法 这个repr魔术方法必须写返回值
return '我是repr方法'
def __call__(self, *args, **kwargs): # 魔术方法 实现类的实例可以调用
print('啦啦啦')
a = Base()
print(a)
# 如果有srt方法,就会调用str方法,没有的话,就去找repr 还没有的话打印地址;
# 在交互模式下,直接输出对象,显示__repr__的返还值
# 交互模式对开发者更友好
一些魔术方法和类中的查询信息的方法