Python class的属性访问控制和内建函数重写实现高级功能以及@property

时间:2023-03-10 06:35:00
Python class的属性访问控制和内建函数重写实现高级功能以及@property

一、类属性的访问控制

Python Class确实是博大精深,我们还是来温习一下属性的访问控制作为开(fu)场(xi)。

首先_varname是可以访问的,__varname是不能直接访问(原理是__varname变成了_classname__varname)

 >>> class A:
... _aa = 1
... __bb = 2
...
>>>
>>>
>>> c = A()
>>> c._aa
1
>>> c.__bb
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: A instance has no attribute '__bb'
>>> c._A__bb
2
>>>

二、内建函数:

不想啰嗦直接上代码,注释来讲解:

 class Person(object):
def __init__(self,name):
self.name = name
def __str__(self):
return "<class:Person Name:%s>"%self.name
def __repr__(self):
return "<Name:%s>"%self.name tom = Person("Tom")
print repr(tom)
print tom

Python class的属性访问控制和内建函数重写实现高级功能以及@property

 class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __str__(self):
return "<class:Person Name:%s>"%self.name
def __repr__(self):
return "<Name:%s>"%self.name
def __len__(self):
return self.age
tom = Person("Tom",20)
print repr(tom)
print tom
print len(tom)

Python class的属性访问控制和内建函数重写实现高级功能以及@property

当然还有很多:

 def __iter__(self):#重写内建迭代功能
ret = do_something()
return ret def __getitem__(self):#增加下表取对象功能
pass def __getattr__(self):#增加取自身属性的处理
pass def __call__(self):#直接实例当做函数调用
pass
"""
class A:
def __call__(self):
print "ok"
a = A()
a()
>>> ok
"""

三、@property方法属性化:

 class student:
def __init__(self,name):
self.name = name
@property
def age(self):
return self.age
@age.setter
def age(self,age):
self.age = age """
a = student("stu")
a.age = 20
a.age
>>> 20
"""