今天给大家介绍一些Python中的类属性中存在的一些具有特殊含义的属性,常常被我们称为魔法属性,详情如下:
1. __doc__
表示类的描述信息
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
# print('__init__')
self.name = name
self.age = age
p = Person('laowang',20)
print(Person.__doc__) #这是类的描述信息
2. __module__和__class__
- __module__: 表示当前操作的对象在那个模块
- __class__:表示当前操作的对象的类是什么
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
# print('__init__')
self.name = name
self.age = age
p = Person('laowang',20)
print(p.__module__) #__main__
print(p.__class__) #<class '__main__.Person'>
3. __init__
初始化方法,通过类创建对象时,自动调用该方法。
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
p = Person('laowang',20) # __init__
4. __del__
当对象在内存中被释放后,该方法自动被调用。
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
def __del__(self):
print('__del__')
# pass
p = Person('laowang',20)
del p # __del__
5. __call__
当对象可以被调用的时候,自动调用该方法,即 对象.( )
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
def __call__(self, *args, **kwargs):
print('__call__')
p = Person('laowang',20)
p() #__call__
6. __dict__
表示类或对象中的所有属性。
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
p = Person('laowang',20)
print(Person.__dict__) # {'__module__': '__main__', '__doc__': '这是类的描述信息', 'country': 'China', '__init__': <function Person.__init__ at 0x104ce7378>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}
print(p.__dict__) # {'name': 'laowang', 'age': 20}
7. __str__
打印对象的时候,如果需要打印对象的详细信息,而不只是打印对象的地址,可以重写该方法。
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
def __str__(self):
return 'haha'
p = Person('laowang',20)
print(p) #haha
8. __getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示获取、设置、删除数据
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
def __getitem__(self, key):
print('__getitem__',key)
def __setitem__(self, key, value):
print('__setitem__',key,value)
def __delitem__(self, key):
print('__delitem__',key)
p2 = Person('xiaoli',18)
print(p2['a'])
p2['b'] = 'lala'
del p2['a']
9. __getitem__、__setitem__、__delitem__
这三个方法在Python2.7中还存在,但在Python3中就取消了。
class Foo(object):
def __getslice__(self,i,j):
print('__getslice',i,j)
def __setslice__(self, i, j, sequence):
print('__setslice__',i,j)
def __delslice__(self, i, j):
print('__delslice__',i,j)
obj = Foo()
obj[-1:1]
obj[0:1] = [11,22,33,44]
del obj[0:2]
10. __int__
__int__方法,在对象被int()包裹的时候会被执行,例如int(obj),如果obj对象没有__int__方法,那么就会报错。在这个方法中返回的值被传递到int类型中进行转换。
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
def __int__(self):
return 100
p1 = Person('laowang',30)
print(int(p)) #100
11. __add__
__add__方法在两个对象相加的时候,调用第一个对象的__add__方法,将第二个对象传递进来,至于怎么处理以及返回值,那是程序员自定义的.
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
def __add__(self, other):
return self.age + other.age
p1 = Person('laowang',30)
p2 = Person('xiaowang',20)
print(p1 + p2) # 50
12. __iter__
类的对象如果想要变成一个可迭代对象,那么对象中必须要有__iter__方法,并且这个方法返回的是一个迭代器。
for 循环的对象如果是一个可迭代的对象,那么会先执行对象中的iter方法,获取到迭代器,然后再执行迭代器中的__next__方法获取数据。如果for循环的是一个迭代器,那么直接执行迭代器中的__next__方法。
class Person(object):
'''这是类的描述信息'''
country = 'China'
def __init__(self,name,age):
print('__init__')
self.name = name
self.age = age
def __iter__(self):
return iter([1,2,3,4])
p1 = Person('laowang',30)
for num in p1:
print(num)
13. __new__、__metaclass__
在python中,一切皆对象,我们定义的类其实也是一个对象,那么,类本身是谁的对象呢?在python2.2之前(或者叫经典类中),所有的类,都是class的对象,但是在新式类中,为了将类型(int,str,float等)和类统一,所以,所有的类都是type类型的对象。当然,这个规则可以被修改,在类中有一个属性 __metaclass__(元类) 可以指定当前类该由哪个类进行实例化。而创建对象过程中,其实构造器不是__init__方法,而是__new__方法,这个方法会返回一个对象,这才是对象的构造器。
class Mytype(type):
def __init__(self, what, bases=None, dict=None):
super(Mytype,self).__init__(what, bases, dict)
def __call__(self, *args, **kwargs):
obj=self.__new__(self)
self.__init__(obj, *args, **kwargs)
return obj
class Foo:
__metaclass__=Mytype
def __init__(self,name,age):
self.name=name
self.age=age
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
obj=Foo("xiaoming",18)
print(obj.name,obj.age) #iaoming 18