类的内置方法(魔法方法)

类的内置方法(魔法方法)

目录

什么是魔法方法?

凡是在类内部定义,以__开头__结尾的方法,都是类的内置方法,也称之为魔法方法

类的内置方法,会在某种条件满足下自动触发。

__new__:在__init__出发前,自动触发,调用该类时,内部会通过__new__产生一个新的对象。

__init__:在调用前触发,通过产生的对象自动调用__init__()

    # 条件: __new__: 在__init__触发前,自动触发。
    def __new__(cls, *args, **kwargs):
        print('此处是__new__方法的执行')
        # python内部通过object调用内部的__new__实现产生一个空的对象  ---> 内存地址
        return object.__new__(cls, *args, **kwargs)

    # 条件: __init__: 在调用类时自动触发。
    def __init__(self):
        print('此处是__init__方法的执行')

__getattr__: 在 “对象.属性” 获取属性时,若 “属性没有” 时触发,可以很方便地动态返回一个属性;

class Foo:
    def __getattr__(self, item):
        return '666'
f = Foo()
print(f.x)

当调用不存在的属性时调用

__getattribute__: 在 “对象.属性” 获取属性时,无论 "属性有没有" 都会触发。

注意: 只要__getattr____getattribute__ 同时存在类的内部,只会触发__getattribute__

__setattr__: 当 “对象.属性 = 属性值” , 添加或修改属性时触发

__call__在调用对象 “对象 + ()” 时触发。

class Foo:
    def __call__(self, *args, **kwargs):
        print(123)
f = Foo()
f() #如果不写上面的__call__方法,就不会调用。如果加上,就正确了
Foo()() #也可以这样表示

__str__因为在python中调用print()打印实例化对象时会调用__str__()如果__str__()中有返回值,就会打印其中的返回值。

# 条件: 在打印对象时触发。
    # 注意: 该方法必须要有一个 “字符串” 返回值。
    # def __str__(self):
    #     print('此处是__str__方法的执行')
    #     return '111'
class ss:
    def __init__(self,age,name):
        self.age = age
        self.name = name
    def __str__(self):
        return str(self.age)+",wozenmezhemeshuai,,"+self.name
if __name__=="__main__":
    s = ss(21,'leitin')
    print(s)
#21,wozenmezhemeshuai,,leitin
不知道大家再写程序时,打印一个实例化对象时,打印的其实时一个对象的地址。而通过__str__()函数就可以帮助我们打印对象中具体的属性值,或者你想得到的东西。
因为在python中调用print()打印实例化对象时会调用__str__()如果__str__()中有返回值,就会打印其中的返回值。
# 在对象通过 “对象[key]” 获取属性时触发。
    # def __getitem__(self, item):
    #     print('此处是__getitem__方法的执行')
    #     print(item)
    #     return self.__dict__[item]
    
def __getitem__(self, item):  #得到   
    return 123
f = Foo()
print(f['qqq'])  #不管里面放的啥值,它都会得到返回值的内容,调用的是__getitem__方法
#结果
123

__class__

1.__class__属性

实例调用__class__属性时会指向该实例对应的类

然后可以再去调用其它类属性,类属性由类调用

class Test:
    
    def start_requests(self):
        cls = self.__class__
        print(cls)

run = Test()
print(run.__class__().start_requests())

self.__classs__.__name__             
//首先用self.__class__将实例变量指向类,然后再去调用__name__类属性
原文地址:https://www.cnblogs.com/kai-/p/11959139.html