反射
用户输入什么属性,直接调用该属性
经过字符串,映射到属性上
经过一个字符串来映射到(访问)对象的属性,叫作反射
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.agespa
内置方法
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__()字符串
内置方法get
元类input
#__call__方法
使对象可调用
class Foo:
def __call__(self,*args,**kwargs)
造出空对象
obj= object.__new__(self)
初始化obj
self.__init__(obj,*args,**kwargs)
返回obj
return obj it
obj = Foo()
实例化对象有三步
造出空对象
初始化obj
返回obj
obj(1,2,3,a =1)
元类内部也应该有一个__call__方法,会在调用Foo时触发执行class
自定义元类控制类的实例化行为的应用
单例模式
实现屡次实例化,获得的对象都是同样
面向对象软件开发
1抽象化类,理清类与类之间的关系
现实中没有逻辑这个类定义一些现实中原本不存在的类一般属性是名词方法是动词