面向对象高阶
反射
用户输入什么属性,直接调用该属性
通过字符串,映射到属性上
通过一个字符串来映射到(访问)对象的属性,叫做反射
choice = input(">>")
print(obj.choice)
hasattr(obj,"name") #判断obj下有没有“name”属性
getattr(obj,'name',None) #拿到obj对象的‘name’属性,没有返回None
setattr(obj,'name','alex') 本质上是obj.name ='alex' 赋值
delattr(obj,"age') #del obj.age
内置方法
iterm系列
将对象模拟成字典去操作它的属性
元类
exec()相当于一个函数去执行,里面的变量是局部变量
#一切皆对象,对象可以这么用
1,都可以被引用,x=obj
2,都可以当做函数的参数传入
3,都可以当做函数的返回值
4,都可以当做容器类的元素
但凡有了这四个用法,就是对象
类也是对象,产生类的类,就是元类,默认所有用class定义的类,他们的元类都是type
定义类的两种方式
1,class
2,type
exec(class_body,globel(),class_dic)
Chinese = type(class_name,class_base,clsee_dic) #类的名字,类的基类,类的名称空间
自定义元类控制类的创建
继承type,重写__init__()
内置方法
元类
#__call__方法
使对象可调用
class Foo:
def __call__(self,*args,**kwargs)
造出空对象
obj= object.__new__(self)
初始化obj
self.__init__(obj,*args,**kwargs)
返回obj
return obj
obj = Foo()
实例化对象有三步
造出空对象
初始化obj
返回obj
obj(1,2,3,a =1)
元类内部也应该有一个__call__方法,会在调用Foo时触发执行
自定义元类控制类的实例化行为的应用
单例模式
实现多次实例化,得到的对象都是一样
面向对象软件开发
1抽象化类,理清类与类之间的关系
现实中没有逻辑这个类
定义一些现实中本来不存在的类
通常属性是名词
方法是动词