【问题标题】:Python properties also as class propertiesPython 属性也作为类属性
【发布时间】:2010-11-10 09:35:45
【问题描述】:

我有一组可以包含可选name 属性的类。原因是如果设置了属性,类将获得默认名称,但如果需要,单个类仍然可以具有自定义名称。

我想要的是能够从类(没有任何类实例)和类的实例中获取 name 属性。

class NameMixin(object):
    def _get_name(self):
        if getattr(self, '_name', ''):
            return self._name
        else:
            return self.__class__.__name__

    def _set_name(self, name):
        self._name = name

    name = property(_get_name, _set_name)

class A(NameMixin):
    name = 'Class A'

class B(NameMixin):
    pass

这里,A 类自定义名称,而B 类没有。

>>> a = A()
>>> a.name
'Class A'
>>> A.name
'Class A'

正如所见,这可以正常工作

>>> b = B()
>>> b.name
'B'
>>> B.name
<property object at 0x7fd50a38c578>

这不是我想要的!从特定实例中获取名称可以正常工作,但尝试从类中获取名称会返回 property object

是否可以直接从类中获取名称而无需使用属性对象跳过箍(我真的无法在需要类属性的地方检查。)

【问题讨论】:

    标签: python properties


    【解决方案1】:
    class NameMixinMeta(type):
        def _get_name(self):
            return getattr(self, '_name', self.__name__)
    
        def _set_name(self, name):
            self._name = name
    
        name = property(_get_name, _set_name)
    
    class NameMixin(object):
        __metaclass__ = NameMixinMeta
        def _get_name(self):
            return getattr(self, '_name', self.__class__.__name__)
    
        def _set_name(self, name):
            self._name = name
    
        name = property(_get_name, _set_name)
    
    class A(NameMixin):
        _name = 'Class A'
    
    class B(NameMixin):
        pass
    

    【讨论】:

    • 嗯...几乎可以工作... A.name 返回'A',这不太正确。但是,您对元类的使用让我思考,似乎我得到了一个可行的解决方案。我将跳过属性和 mixins,在元类中我将覆盖 __new__ 并在字典中添加“名称”(如果它不存在)。
    【解决方案2】:

    我不确定你的 NameMixin 课程是否在这里工作。

    在第一种情况下,name 是一个类属性,可以像你说的那样访问。

    >>> class A():
    ...     name = 'Class A'
    ... 
    >>> 
    >>> a = A()
    >>> a.name
    'Class A'
    >>> A.name
    'Class A'
    >>> 
    

    在第二种情况下,NameMixin 类具有按照您的建议返回属性的效果。

    【讨论】:

      猜你喜欢
      • 2013-11-18
      • 2011-11-24
      • 2012-10-11
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      相关资源
      最近更新 更多