Python 使属性只读的较短方法
我在许多网站上读到,如果我想创建只读属性,我应该使用Python 使属性只读的较短方法,python,class,properties,readonly,readability,Python,Class,Properties,Readonly,Readability,我在许多网站上读到,如果我想创建只读属性,我应该使用属性装饰器 像这样: class MyClass(object): def __init__(self): self._a = None @property def a(self): return self._a 如果一个类中只有1-3个只读属性,我认为这是一个很好的解决方案。但是如果我有10个呢?这将导致额外增加40行代码,将所有代码标记为只读。在我看来,这并不真正适合Python,因为Python是一种不需要
属性
装饰器
像这样:
class MyClass(object):
def __init__(self):
self._a = None
@property
def a(self):
return self._a
如果一个类中只有1-3个只读属性,我认为这是一个很好的解决方案。但是如果我有10个呢?这将导致额外增加40行代码,将所有代码标记为只读。在我看来,这并不真正适合Python,因为Python是一种不需要编写大量代码来完成小事情的语言
在Python中,真的没有更简单的方法使属性只读吗?至少,您可以将
属性作为函数调用,而不是将其用作装饰器。同时,您可以将基础值存储在列表或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")
然后将对属性的调用包装到另一个函数中:)
下面是一个纯Python只读属性,它是根据以下示例建模的:
这可能比子类化属性
并覆盖\uuuuuuuu设置
和\uuuu删除
以“取消”它们更简单。但是,我更喜欢在常规属性周围使用包装器的想法。至少,您可以将属性作为函数调用,而不是将其用作装饰器。同时,您可以将基础值存储在列表或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")
然后将对属性的调用包装到另一个函数中:)
下面是一个纯Python只读属性,它是根据以下示例建模的:
这可能比子类化属性
并覆盖\uuuuuuuu设置
和\uuuu删除
以“取消”它们更简单。但是,我更喜欢在常规属性周围使用包装器的想法。一个类中有10个只读属性已经有点不寻常了。为什么需要这个?属性
只是描述符协议的一个应用程序。我很确定您可以定义自己的readonlyproperty
类,让您编写a=readonlyproperty(“\u a”)
,b=readonlyproperty(“\u b”)代码>,等等,但我必须花一些时间记住这是如何工作的。您想使整个对象不可变,还是仅使某些属性不变?您可以实现\uuuu setattr\uuuu
,这样它就可以忽略更改某些属性的尝试。为什么需要这个?属性
只是描述符协议的一个应用程序。我很确定您可以定义自己的readonlyproperty
类,让您编写a=readonlyproperty(“\u a”)
,b=readonlyproperty(“\u b”)代码>,等等,但我必须花一些时间记住这是如何工作的。您想使整个对象不可变,还是仅使某些属性不变?您可以实现\uuuu setattr\uuuuu
,以便它忽略更改某些属性的尝试。它是从类外部只读的,但这并不意味着它可以由类本身更改;)但我喜欢你的第一次尝试。谢谢它是从类外部只读的,但这并不意味着它可以由类本身更改;)但我喜欢你的第一次尝试。谢谢