反射 内置方法

如何实现反射

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__内会返回一个初始化好的对象

 

 

 

 

 

posted @   朱饱饱  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示