• Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property


    参考:@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

  • 相关阅读:
    我们的故事
    实验三 进程调度模拟程序
    Java环境配置XXX系统(标题党)
    .Net多线程和线程通信(标题党)
    关于数据库死锁,数据库脏数据和产生的原因,数据库事务(标题党)
    微服务架构(一):什么是微服务
    .NET Core 实践一:微服务架构的优点(转)
    .NET Core 实践二:事件通知和异步处理
    设计模式之单例模式
    数组式访问-ArrayAccess
  • 原文地址:https://www.cnblogs.com/qq952693358/p/6498903.html
Copyright © 2020-2023  润新知