[英]Shorter way to make properties read-only
我在许多站点上读到,如果要创建只读属性,则应使用property
装饰器。
像这样:
class MyClass(object):
def __init__(self):
self._a = None
@property
def a(self):
return self._a
如果我在一个类中只有1-3个只读属性,我认为这是一个很好的解决方案。 但是,如果我可能有10个呢? 这将导致多出40行代码,仅将它们全部标记为只读。 在我看来,这真的不适合Python,这意味着Python是一种无需编写大量代码即可完成小工作的语言。
真的没有更短的方法在Python中将属性设置为只读吗?
至少,您可以将property
作为一个函数调用,而不是将其用作装饰器。 同时,您可以将基础值存储在列表或dict中,而不是存储为单独的属性。
class MyClass(object):
def __init__(self):
self._values = [...]
a = property(lambda self: self._values[0])
b = property(lambda self: self._values[1])
# etc
但是,只读属性实际上并不需要将其值存储在实例dict中。 只需直接在getter中将值硬编码即可:
class MyClass(object):
a = property(lambda self: "foo")
b = property(lambda self: "bar")
然后将对属性的调用包装在另一个函数中:)
def constant(value):
def _(self):
return value
return property(_)
class MyClass(object):
a = constant("foo")
b = constant("bar")
这是一个纯Python的只读属性,以https://docs.python.org/3/howto/descriptor.html#properties中显示的示例为模型:
class Constant(object):
def __init__(self, value)
def _(self):
return value
self.fget = _
def __get__(self, obj, objtype=None):
if obj is None:
return self
return self.fget(obj)
这可能比简单的继承property
和压倒一切的__set__
和__del__
为“unimplement”他们。 但是,我更喜欢围绕常规属性包装的想法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.