参考:@property

NOTE

1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核。

#!/usr/bin/env python3

class MyClass(object):
"""docstring for MyClass"""
def __init__(self):
super(MyClass, self).__init__() def set_Attr(self, score):
if score >= 0 and score <= 100:
self.score = score
else:
raise ValueError('Attribute Setting Error') def get_Attr(self):
return self.score def main():
A = MyClass()
A.score = 59
print(A.get_Attr()) A.set_Attr(101)
print(A.get_Attr()) if __name__ == '__main__':
main()
59
Traceback (most recent call last):
File "./oop9.py", line 26, in <module>
main()
File "./oop9.py", line 22, in main
A.set_Attr(101)
File "./oop9.py", line 12, in set_Attr
raise ValueError('Attribute Setting Error')
ValueError: Attribute Setting Error

普通的做法是,调用对象的方法传入参数并设置,但是这样看上去又过于繁琐。

2.Python内置的@property装饰器负责把一个方法变成属性进行调用:

class Student(object):
"""docstring for Student"""
def __init__(self):
super(Student, self).__init__() @property
def score(self): # turn into an attribute
return self.score @score.setter
def score(self, val):
if val >= 0 and val <= 100:
self.score = val
else:
raise ValueError('Attribute Setting Error')
RecursionError: maximum recursion depth exceeded in comparison

把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。

getter => Attribute => create setter

3.还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

class Student(object):
"""docstring for Student"""
def __init__(self):
super(Student, self).__init__() @property
def score(self): # turn into an attribute
return self.score

此时Attribute score就是一个只读属性。无法对其进行设置或赋值。

2017/3/3

Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property的更多相关文章

  1. Python学习札记(三十) 面向对象编程 Object Oriented Program 1

    参考:OOP NOTE 1.面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. ...

  2. Python学习札记(三十三) 面向对象编程 Object Oriented Program 4

    参考:继承和多态 NOTE 著名的开闭原则: 对扩展开放:允许新增Animal子类: 对修改封闭:不需要修改依赖Animal类型的Animal_func()等函数. 1.eg. #!/usr/bin/ ...

  3. Python学习札记(三十一) 面向对象编程 Object Oriented Program 2

    参考:类和实例 注意理解第七点. NOTE: 1.类是抽象的模板,比如Student类,实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. ...

  4. Python学习札记(四十) 面向对象编程 Object Oriented Program 11

    参考:使用元类 NOTE: type() 1.type()函数可以用于检查一个类或者变量的类型. #!/usr/bin/env python3 class Myclass(object): " ...

  5. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  6. Python学习札记(三十四) 面向对象编程 Object Oriented Program 5

    参考:获取对象信息 NOTE 1.type()函数可以用来判断对象的类型: >>> type(123) <class 'int'> >>> type(' ...

  7. Python学习札记(三十八) 面向对象编程 Object Oriented Program 9

    参考:多重继承 NOTE #!/usr/bin/env python3 class Animal(object): def __init__(self, name): self.name = name ...

  8. Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__

    参考:slots NOTE 1.动态语言灵活绑定属性及方法. #!/usr/bin/env python3 class MyClass(object): def __init__(self): pas ...

  9. Python学习札记(三十五) 面向对象编程 Object Oriented Program 6

    参考:实例属性和类属性 NOTE Python是动态语言,根据类创建的实例可以任意绑定属性. class Student(object): def __init__(self, name): self ...

随机推荐

  1. ScrollView 设置滚动是否可用

    extends:http://stackoverflow.com/questions/5763304/disable-scrollview-programmatically , http://stac ...

  2. DGbroker快速失败转移

    1.先决条件 DGMGRL> ENABLE FAST_START FAILOVER; Error: ORA-: requirements not met for enabling fast-st ...

  3. Thinkphp的cookie的怎么玩?

    在使用COOKIE的时候,首先要对COOKIE进行加密,加密方式采用:异位或的方式进行加密: // 异位或加密 1是加密 0 是解密 function encrytion($value,$type=0 ...

  4. V2EX的RSS订阅地址

    1.全站RSS输出: https://www.v2ex.com/index.xml 2.单独节点RSS输出: http://www.v2ex.com/feed/{节点名}.xml  以shadowso ...

  5. 由于dns服务为启动导致的GI集群启动故障

    1.物业由于突然断电导致grid集群重新启动后rac数据库无法正常启动,对集群进行检查,结果如下,发现其中有4个数据库状态为instance shutdown.[root@node1 ~]# su - ...

  6. BBS - 后台管理

    一.添加文章 注: 后台管理页面,应该有个新得 app /blog/backend/ # 文章列表页/blog/add_article/ # 添加文章 # 后台管理re_path(r'backend/ ...

  7. 拨开障目的叶,一览CMDB庐山真面目

    人们往往用"一叶障目,不见泰山"来形容一个人被局部现象所迷惑,看不到事物发展的整体脉络,从而做出一些不是十分正确的决策.小编觉得对于运维何尝不是这样呢. 大多数企业资产配置维护的现 ...

  8. python通过os.walk() 遍历出多级目录下所有文件绝对路径

    代码如下 将遍历出来的路径全部添加到列表中: def get_all_abs_path(source_dir): path_list = [] for fpathe, dirs, fs in os.w ...

  9. 解决Eclipse中新建jsp文件总是以ISO8859-1编码问题

    eclipse --> window -->Preferences-->web-->jsp-->utf-8

  10. 蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现

           蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现        尽管蓝牙4.0 BLE芯片CC2540 是单芯片(即用户能够对它进行芯片级代码编写), 是80 ...