类的内置方法(魔法方法)
什么是魔法方法?
凡是在类内部定义,以__开头__
结尾的方法,都是类的内置方法,也称之为魔法方法
类的内置方法,会在某种条件满足下自动触发。
__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__类属性