gpt4 book ai didi

Python 属性也作为类属性

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:53 25 4
gpt4 key购买 nike

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

关于Python 属性也作为类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4143002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com