类的属性
属性的基本使用
属性的定义和调用需要注意以下几点:
- 定义时,在普通方法的基础上添加@property装饰器
- 定义时,属性仅有一个self参数
- 调用时,无需括号,obj.all_paper
属性存在的意义:访问属性时,可以制造出和访问字段完全相同的假象,由于属性是由方法变种而来,如果python中没有属性,完全可以由方法来替代.
属性的两种定义方式
python3中全都是新式类,有三种@property装饰方式:
- @property
- 方法名.setter
- 方法名.deleter
其实就像上面的例子.
还有一种方式是静态字段方式.创建值为property的对象的静态字段.
来看个例子:
class Pager: def __init__(self,name): self.name=name def f1(self): return 123 def f2(self,value): print(value) def f3(self): print('del....') foo=property(fget=f1,fset=f2,fdel=f3) obj=Pager(110) ret=obj.foo #调用fget print(ret) obj.foo=778 #调用fset del obj.foo #调用fdel
out:
123
778
del....
其中fget,fset,fdel为默认参数.
class Pager: def __init__(self,all_count): self.all_count = all_count def f1(self): return 123 def f2(self,value): self.value = value print(self.value) def f3(self): pass foo = property(fget=f1,fset=f2,fdel=f3) p = Pager(101) #获取属性的值,默认会调用fget result = p.foo print(result) #修改属性的值,默认会调用fset p.foo = "alex" # 删除属性的值,默认会调用fdel del p.foo
out:
123
alex
1.创建类的属性
使用@property装饰器来创建
class Pager: def __init__(self,all_count): self.all_count = all_count @property def all_pager(self): a1,a2 = divmod(self.all_count,10) if a2 == 0: return a1 else: return a1+1
2.获取类的属性
class Pager: def __init__(self,all_count): self.all_count = all_count @property def all_pager(self): a1,a2 = divmod(self.all_count,10) if a2 == 0: return a1 else: return a1+1 p = Pager(101) ret = p.all_pager print(ret)
out :
11
3、设置类的属性
使用装饰器 @all_pager.setter 然后使用 p.all_pager = 111 修改属性的值
class Pager: def __init__(self,all_count): self.all_count = all_count @property def all_pager(self): a1,a2 = divmod(self.all_count,10) if a2 == 0: return a1 else: return a1+1 @all_pager.setter def all_pager(self,value): print(value) p = Pager(101) p.all_pager = 111
out :
111
4、删除属性
使用@all_pager.deleter 和 del p.all_pager
class Pager: def __init__(self,all_count): self.all_count = all_count @property def all_pager(self): a1,a2 = divmod(self.all_count,10) if a2 == 0: return a1 else: return a1+1 @all_pager.deleter def all_pager(self): print('del all_pager') p = Pager(101) del p.all_pager
out:
del all_pager