python实例属性管理
Posted gj4990
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实例属性管理相关的知识,希望对你有一定的参考价值。
在python中,需要对某个实例attribute增加除访问与修改之外的其他处理逻辑,比如类型检查或合法性验证。下面通过两种方法进行实现。(具体参考《python cookbook》)
# -*- coding:utf-8 -*-
#getter和setter主要用于实例属性的检测
#以下是通过类的方式实现的实例属性的检测,
#但是如果有很多属性需要检测,则将实现很多冗余的代码。
#因此可以通过第二种方法进行解决。
class NameAge:
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@name.setter
def name(self, value):
if not isinstance(value, str):
raise TypeError("name must be a string")
else:
self._name = value
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise TypeError("age must be a int")
else:
self._age = value
#第二种方法
def typed_property(name, expected_type):
storage_name = '%s%s' %('_', name)
@property
def proper(self):
return getattr(self, storage_name)
@proper.setter
def proper(self, value):
if not isinstance(value, expected_type):
raise TypeError("0 must be a 1".format(name, expected_type))
else:
setattr(self, storage_name, value)
return proper
class NameAge2:
name = typed_property('name', str)
age = typed_property('age', int)
def __init__(self, name, age):
self.name = name
self.age = age
def main():
obj1 = NameAge("alice", 10)
print("Obj1 -> name: 0 age: 1".format(obj1.name, obj1.age))
obj1.name = "david"
obj1.age = 20
print("Obj1 -> name: 0 age: 1".format(obj1.name, obj1.age))
#异常
#obj1.name = 10
obj2 = NameAge2("alex", 11)
print("Obj2 -> name: 0 age: 1".format(obj2.name, obj2.age))
obj2.name = "bob"
obj2.age = 13
print("Obj2 -> name: 0 age: 1".format(obj2.name, obj2.age))
#异常
#obj2.age = 'tila'
if __name__ == "__main__":
main()
运行结果:
Obj1 -> name: alice age: 10
Obj1 -> name: david age: 20
Obj2 -> name: alex age: 11
Obj2 -> name: bob age: 13
以上是关于python实例属性管理的主要内容,如果未能解决你的问题,请参考以下文章