多继承的新式类 广度优先:一条路走到倒数第二级,判断,如果其他路能走到终点,则返回走别一条路,如果不能,则走到终点
多继承的经典类:一条路走到黑
深度优先,广度优先:只能是继承两个类的情况
继承的优点:
节约代码
规范代码
统一化接口设计
# class Alipay: # def __init__(self, money): # self.money = money # # def pay(self): # print("使用京东支付了%s" % self.money) # # # class Jdpay: # def __init__(self, money): # self.money = money # # def pay(self): # print("使用京东支付了%s" % self.money) def pay(obj): obj.pay() a1 = Alipay(200) j1 = Jdpay(100) pay(a1)
抽象类接口类
from abc import ABCMEta, abstractmethod class Payment(metaclass=ABCMEta):# 抽象类(接口类) @abstractmethod# 强制指定一个规范,凡事继承我的类中必须有pay方法,如果,如果没有就会报错 def pay(self): pass封装
广义的封装: 把方法和属性都封装在一个类里,定义一个规范来描述一类事物
狭义的封装: 私有化,只有在类的内部访问
__age 对于私有静态字段来说,只能在本类中,类的外部
python处处都是多态
一种类型的多种形态,多个子类去继承父类,那么每一个子类都是这个父类的一种形态
property 装饰器函数,内置函数,帮助你将类中的方法伪装成属性,特性
调用方法的时候不需要主动加括号
让程序的逻辑性更合理
@方法名.setter 装饰器,修改被property装饰的属性的时候会调用被这个
@方法名.deleter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self之外还有一个参数,被修改的值
静态方法
class A: @staticmethod def func(): print(666) A.func()类方法
# class A: # # count=1 # @classmethod # def func(cls): # 此方法无需对象参与 # print(cls) # print(cls.age) # def func2(self): # print(self) # class B(A): # age=22 # def f1(self): # pass # # B.func() # b1=B() # b1.func2() 属性:将方法伪装成一个属性,代码上没有什么提升,只是更合理 @property @属性名.setter @属性.deleter 类方法 @classmethod 只能有类名调用(对象调用,传给cls参数也是该对象的所属类) 使用场景 1.无序对象参与 2.对类中的静态变量进行修改 3.在父类中类方法得到子类的类空间 静态方法 @staticmethod 代码性,清晰 复用性isinstance() 判断对象所属类型,包括继承关系
issubclass() 判断类与类之间的继承关系(前面父类,后面子类)
class A:pass class B(A):pass print(issubclass(B,A))# True print(issubclass(A,B))#False 反射反射: 用字符串数据类型的变量名来访问这个变量的值
class Student: ROLE = 'STUDENT' # eval 这个东西 明确的写在你的代码里 print(Student.ROLE) # 'ROLE' # eval() print(getattr(Student,"ROLE"))反射的方法:getatter hasattr setattr delattr class Student: ROLE = 'STUDENT' @classmethod def check_course(cls): print('查看课程了') @staticmethod def login(): print("登录") # 反射查看属性 print(Student.ROLE) print(getattr(Student, "ROLE")) print(Student.__dict__) # 反射调用方法 # getattr(Student,'check_course')() #类方法 # getattr(Student,'login')() # 静态方法 num = input(">>>") if hasattr(Student, num): getattr(Student, num)() setattr(a,'name','alex_SB') 对象,属性,替换的属性
单例(指向同一块内存空间)
如果一个类,从头到尾只有一个实例,说明从头到尾只开辟一块属于对象的空间,那么这个类就是一个单例类
__call__ 相当于对象()
Lisp语言???a.func 就是在a对象中存储了类对象的指针(想当于记录了func地址的变量)
抽象类和接口类