首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中创建只读类属性?

如何在Python中创建只读类属性?
EN

Stack Overflow用户
提问于 2010-07-08 20:00:12
回答 2查看 37.1K关注 0票数 73

从本质上讲,我想做这样的事情:

代码语言:javascript
复制
class foo:
    x = 4
    @property
    @classmethod
    def number(cls):
        return x

然后,我希望以下内容能够起作用:

代码语言:javascript
复制
>>> foo.number
4

不幸的是,上面的方法不起作用。它给我的不是4,而是<property object at 0x101786c58>。有没有办法做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-08 20:43:55

当从一个类访问时,property描述符总是返回自身(即,当instance在其__get__方法中为None时)。

如果这不是您想要的,您可以编写一个始终使用类对象(owner)而不是实例的新描述符:

代码语言:javascript
复制
>>> class classproperty(object):
...     def __init__(self, getter):
...         self.getter= getter
...     def __get__(self, instance, owner):
...         return self.getter(owner)
... 
>>> class Foo(object):
...     x= 4
...     @classproperty
...     def number(cls):
...         return cls.x
... 
>>> Foo().number
4
>>> Foo.number
4
票数 54
EN

Stack Overflow用户

发布于 2018-05-25 02:36:46

Mikhail Gerasimov的解决方案是相当完整的。不幸的是,这是一个缺点。如果你有一个使用他的类属性的类,由于带有class WrapperTypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases,任何子类都不能使用它。

幸运的是,这是可以修复的。在创建class Meta时,只继承给定类的元类。

代码语言:javascript
复制
def classproperty_support(cls):
  """
  Class decorator to add metaclass to our class.
  Metaclass uses to add descriptors to class attributes, see:
  http://stackoverflow.com/a/26634248/1113207
  """
  # Use type(cls) to use metaclass of given class
  class Meta(type(cls)): 
      pass

  for name, obj in vars(cls).items():
      if isinstance(obj, classproperty):
          setattr(Meta, name, property(obj.fget, obj.fset, obj.fdel))

  class Wrapper(cls, metaclass=Meta):
      pass
  return Wrapper
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3203286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档