一、类属性的访问控制
Python Class确实是博大精深,我们还是来温习一下属性的访问控制作为开(fu)场(xi)。
首先_varname是可以访问的,__varname是不能直接访问(原理是__varname变成了_classname__varname)
1 >>> class A: 2 ... _aa = 1 3 ... __bb = 2 4 ... 5 >>> 6 >>> 7 >>> c = A() 8 >>> c._aa 9 1 10 >>> c.__bb 11 Traceback (most recent call last): 12 File "<stdin>", line 1, in <module> 13 AttributeError: A instance has no attribute ‘__bb‘ 14 >>> c._A__bb 15 2 16 >>>
二、内建函数:
不想啰嗦直接上代码,注释来讲解:
1 class Person(object): 2 def __init__(self,name): 3 self.name = name 4 def __str__(self): 5 return "<class:Person Name:%s>"%self.name 6 def __repr__(self): 7 return "<Name:%s>"%self.name 8 9 tom = Person("Tom") 10 print repr(tom) 11 print tom
1 class Person(object): 2 def __init__(self,name,age): 3 self.name = name 4 self.age = age 5 def __str__(self): 6 return "<class:Person Name:%s>"%self.name 7 def __repr__(self): 8 return "<Name:%s>"%self.name 9 def __len__(self): 10 return self.age 11 tom = Person("Tom",20) 12 print repr(tom) 13 print tom 14 print len(tom)
当然还有很多:
1 def __iter__(self):#重写内建迭代功能 2 ret = do_something() 3 return ret 4 5 def __getitem__(self):#增加下表取对象功能 6 pass 7 8 def __getattr__(self):#增加取自身属性的处理 9 pass 10 11 def __call__(self):#直接实例当做函数调用 12 pass 13 """ 14 class A: 15 def __call__(self): 16 print "ok" 17 a = A() 18 a() 19 >>> ok 20 """
三、@property方法属性化:
1 class student: 2 def __init__(self,name): 3 self.name = name 4 @property 5 def age(self): 6 return self.age 7 @age.setter 8 def age(self,age): 9 self.age = age 10 11 """ 12 a = student("stu") 13 a.age = 20 14 a.age 15 >>> 20 16 """