代码之家  ›  专栏  ›  技术社区  ›  Some programmer dude

Python属性也作为类属性

  •  2
  • Some programmer dude  · 技术社区  · 14 年前

    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

    是否可以直接从类中获取名称,而不必使用property对象跳过环(无论如何,我在需要class属性的地方都无法检查这个属性)

    2 回复  |  直到 14 年前
        1
  •  1
  •   John La Rooy    14 年前
    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
    
        2
  •  0
  •   pyfunc    14 年前

    我不确定你的NAMMIXIN班是否在这里工作。

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

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