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实例属性管理的主要内容,如果未能解决你的问题,请参考以下文章

Python——管理属性

Python类的__dict__

python面向对象

Python 单例实际应用

python3学习笔记 静态方法,类方法,属性方法

python 类属性与实例属性