Skip to main content
 首页 » 编程设计

Python 属性也作为类属性

2025年05月04日14softidea

我有一组类可以包含可选的 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> 

这不符合我的要求!从特定实例中获取名称可以正常工作,但尝试从类中获取名称会返回一个属性对象。

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

请您参考如下方法:

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