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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值