使属性只读的更短方法
Shorter way to make properties read-only
我在很多网站上看到,如果我想创建一个只读 属性,我应该使用 property
装饰器。
像这样:
class MyClass(object):
def __init__(self):
self._a = None
@property
def a(self):
return self._a
如果我在 class 中只有 1-3 个只读属性,我认为这是一个很好的解决方案。但是,如果我可能有 10 个这样的东西怎么办?这将导致额外的 40 行代码仅用于将它们全部标记为只读。在我看来,这并不真正适合 Python,它是一种语言,您不必编写大量代码来做一些小事。
真的没有更短的方法可以在 Python 中使 属性 只读吗?
至少,您可以将 property
作为函数调用,而不是将其用作装饰器。同时,您可以将基础值存储在列表或字典中,而不是作为单独的属性。
class MyClass(object):
def __init__(self):
self._values = [...]
a = property(lambda self: self._values[0])
b = property(lambda self: self._values[1])
# etc
然而,一个只读的 属性 并不真的需要将它的值存储在实例字典中;直接在 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" 它们更简单。但是,我更喜欢围绕常规 属性 包装的想法。
我在很多网站上看到,如果我想创建一个只读 属性,我应该使用 property
装饰器。
像这样:
class MyClass(object):
def __init__(self):
self._a = None
@property
def a(self):
return self._a
如果我在 class 中只有 1-3 个只读属性,我认为这是一个很好的解决方案。但是,如果我可能有 10 个这样的东西怎么办?这将导致额外的 40 行代码仅用于将它们全部标记为只读。在我看来,这并不真正适合 Python,它是一种语言,您不必编写大量代码来做一些小事。
真的没有更短的方法可以在 Python 中使 属性 只读吗?
至少,您可以将 property
作为函数调用,而不是将其用作装饰器。同时,您可以将基础值存储在列表或字典中,而不是作为单独的属性。
class MyClass(object):
def __init__(self):
self._values = [...]
a = property(lambda self: self._values[0])
b = property(lambda self: self._values[1])
# etc
然而,一个只读的 属性 并不真的需要将它的值存储在实例字典中;直接在 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" 它们更简单。但是,我更喜欢围绕常规 属性 包装的想法。