在Python中有一些__xxx__的变量或者函数名,这些是有特殊用途的。

特殊属性:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

object.__dict__, 将对象中封装的所有内容通过字典的形式返回。

class.__bases__, 类对象的基类的元组。

definition.__name__, 类,函数,方法,描述符或生成器实例的名称。

class.__mro__, 此属性是解析基类时类的元组。

class Foo(object):

    def __init__(self):
        self.name = 'Alice'
        self.age = 28

class Fo(Foo):
    pass

f = Fo()
print(f.__dict__)    #{'name': 'Alice', 'age': 28}
print(Fo.__bases__)    #(<class '__main__.Foo'>,)
print(Fo.__name__)    #Fo
print(Fo.__mro__)    #(<class '__main__.Fo'>, <class '__main__.Foo'>, <class 'object'>)

特殊方法:

__new__(cls, *args, **kws), 创建类的新实例时调用它,参数cls代表当前类,返回值是一个新的对象实例。

__init__(self), 在创建对象实例之后使用,接受一个参数self,就是__new__返回的对象实例;然后对实例进行一些初始化的操作;

class Foo(object):

    def __new__(cls, *args, **kwargs):
        cls.name = 'Foo_class'  #可以设置类属性
        print('new_method')
        return object.__new__(cls, *args, ** kwargs)  #cls参数是创建当前类的实例

    def __init__(self):    #self是new创建的实例
        self.age = 22  #设置一些初始化属性
        print('init_method')  #不需要有返回值

f = Foo()  #new_method
print(Foo.name)  #Foo_class
f = Foo()  #init_method
print(f.age)  #22

__str__(self), 对象进行print()操作时调用此方法,返回值必须是一个字符串对象。

__call__(cls, *args, **kws), 将对象被当作函数调用时,如果定义了这个方法,则调用此方法。

__del__(self), 当对象即将被销毁时调用,不再被使用才会被销毁,也成为析构函数。

class Foo(object):

    def __str__(self):  #被print()时执行
        return 'this is a special method test script'

    def __call__(self, *args, **kwargs):    #被()时执行
        print('instance is called')

    def __del__(self):  #销毁时执行
        print('deleted')
        
f = Foo()
print(f)    #this is a special method test script
f()    #instance is called
#f重新赋值,Foo不再被使用,则Foo被销毁
f = '123'   #deleted 

__getitem__(self, item), __setitem__(self, key, value), __delitem__(sef,key), 可以使对象进行切片(slice对象)和索引;

class Foo(object):

    def __init__(self):
        self.info_list = list(range(0,10))

    def __getitem__(self, item):
        return self.info_list[item]

    def __setitem__(self, key, value):
        self.info_list[key] = value

    def __delitem__(self, key):
        self.info_list.pop(key)

f = Foo()
print(f[0:3:2]) #[0, 2]
f[2] = '28'
print(f[2]) #28
del f[5]
print(f[5]) #6

__iter__(self), 类中有__iter__方法就认为是可迭代对象,此方法返回一个迭代器对象;

class Fib:

    def __iter__(self):
        #result = (x for x in range(0,10))
        result = iter([11,22,33])
        return result

f = Fib()
for i in f:
    print(i)

#运行结果
11
22
33
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄