如何实现反射:
class People:
def __inti__(self,name,age):
self.name=name
self.age=age
def say(self):
print('<%s;%s>'%(self.name,self.age))
obj=People('猪猪同学',18)
classFtp:
def put(self):
print('正在执行上传功能')
def get()self:
print('正在执行下载功能')
def interactive(self):
method=input('>>>:').strip() #method='put' or 'get'
if hasattr(salf,method):
getattr(self,method)() #获取到用户输入的功能 再加括号运行功能
else:
print('输入的指令不存在')
obj=Ftp()
obj.interactive()
内置方法
是在类内部,以_ _开头并以_ _结尾的方法
特点:在某种情况下自动触发执行
为何要用内置方法:为了定制化我们的类or对象
__str__:再打印对象时会自动触发,然后将返回值当作
本次打印的结果输出 返回值 必须是字符串类型
__del__ 再删除之前 告诉操作系统删除这个(大致意思)
class机制分析:
class关键字创造类People的步骤:
1.拿类名 class_mame='People'
2.类的基类 class_bases=(object,) 类型是元组
3.执行类体代码拿到类的名称空间 class_dic={}
exec(class_body,{},class_dic) #先拿到class_body里面的字符串,再创建一个字典,把内容放到字典里面去
4.会去帮我们调用元类
type(class_name,class_bases,class_dic)
如何自定义元类:
只有继承了type类的类才是元类
调元类或者实例化三个步骤:(type)
1.先造空对象===》People,调用类里面的__new__方法 造空对象
当前所在的类,调用类时所传入的参数
def __new__(cls,*args,**kwargs):
2.调用m这个类里面的__init__方法 完成初始化对象的操作
会将return的返回值空对象self和*args,**kwargs一起传给__init__ 初始化对象
3.返回初始化好的对象
class m(type):
pass
class p(metaclass=m):
def __init__(self,name,age):
pass
.istitle()判断xx的首字母是否是大写
__call__:
如果想让一个对象加括号可以被调用 就在类中加__call__方法
例如:
class Foo:
def __init__(self,x):
self.x=x
self.y=y
def __call__(self,*args,**kwargs):
print('===>',args,kwargs)
return 123
obj=Foo(111,222)
res=obj(1,2,3,a=4,b=5,c=6)
print(res)
总结:
对象()-->类内的__call__
类()-->自定义元类内的__call__
自定义元类()-->内置元类__call__
类的产生:
1.type.__call__函数内会先调用Mymeta内的__new__
2.type.__call__内会调用调用Mymeta内的__init__
3.type.__call__内会返回一个初始化好的对象
类的调用:
obj=People('zhuzhu',18)====>Mymeta.__call__======干了三件事
1.Mymeta.__call__函数内会先调用People内的__new__
2.Mymeta.__call__内会调用调用People内的__init__
3.Mymeta.__call__内会返回一个初始化好的对象
标签:__,反射,内置,self,调用,call,方法,class,def From: https://www.cnblogs.com/97zs/p/17672506.html