OOP-常用魔术方法

mac2024-03-16  30

类的常用魔术方法

魔术方法就是不需要认为调用的方法,基本是在特定的时刻自动触发魔术方法的统一特征,方法名前后各两个下划线包裹操作类 ‘__init__’: 构造函数‘__new__’: 对象实例化方法,此函数教特殊,一般不需要使用‘__call__’: 对象当函数使用的时候触发‘_str_’: 当对象被当作字符串使用的时候调用‘__repr__’: 返回字符串,跟’_str_'具体区别 描述符相关 ‘__set__’‘__get__’‘__delete__’ 属性操作相关 ‘__getattr__’: 访问一个不存在的属性时触发‘__setattr__’: 对成员属性进行设置的时候触发 参数: self用来获取当前对象被设置的属性名称,以字符串形式出现需要对属性名称设置的值 作用:进行属性设置的时候进行验证或者修改注意:在该方法中不能对属性直接进行赋值操作,否则死循环 运算分类相关魔术方法 ‘__gt__’: 进行大于判断的时候触发的函数 参数: self第二个参数是第二个对象返回值可以是任意值,推荐返回布尔值 # __call__举例 class A(): def __init__(self,name): print("init,我被调用了") def __call__(self): print("call,被调用了") a = A("123") a() init,我被调用了 call,被调用了 # __str__举例 class A(): def __init__(self,name): print("init,我被调用了") def __call__(self): print("call,被调用了") def __str__(self): return "产品是xx" a = A("123") print(a) init,我被调用了 产品是xx # __getattr__举例 class A(): name = "NoName" age = 18 def __getattr__(self,name): print("运行,getattr") print(name) a = A() print(a.name) print(a.addr) NoName 运行,getattr addr None # __setattr__案例 class Person(): def __init__(self): pass def __setattr__(self,name,value): print("设置属性:{0}".format(name)) # 下面语句会导致问题,死循环 #self.name = value # 此种情况,为了避免死循环,规定统一调用父类魔法函数 super().__setattr__(name,value) p = Person() print(p.__dict__) p.age = 18 {} 设置属性:age # __gt__案例 class Student(): def __init__(self,name): self.name = name def __gt__(self, obj): print("{0}会比{1}大吗?".format(self.name,obj.name)) return self.name > obj.name stu1 = Student("one") stu2 = Student("two") print(stu1 > stu2) one会比two大吗? False
最新回复(0)