在 python 中设置只读的 `@属性` 更简洁
More concise form to set a read-only `@property` in python
我知道如果我想在 python 中设置只读 属性 我可以在 class 中执行以下操作:
class Foo(object):
@property
def foo(self):
return self._foo
但在我有许多像这个一样简单的属性的情况下,它似乎仍然太长(3/4 行)。
我知道我可以自己编写一个系统来创建只读属性,但我想避免重新发明轮子。
我想知道是否有特殊功能可以执行以下操作:
create_ro_property(self,"foo","_foo",42) # where 42 is the initial value of 42
这将创建一个只读的 属性 foo
,可以通过 _foo
.
在内部设置对象
有什么想法吗?
您可以按如下方式进行:
class Foo(object):
foo = property(lambda self: self._foo)
@
只是语法糖,lambda
可以代替如此琐碎的 def
来创建 getter。
请注意,这不会设置 42
的初始值;你仍然必须这样做,例如在 __init__
。或者,也许你可以在 __getattr__
到 return None
中做一些聪明的事情来弥补以 _
开头的缺失属性,然后使 return 值 self._foo or 42
(或者,如果 0
是有效值,则 42 if self._foo is None else self._foo
)。
我知道如果我想在 python 中设置只读 属性 我可以在 class 中执行以下操作:
class Foo(object):
@property
def foo(self):
return self._foo
但在我有许多像这个一样简单的属性的情况下,它似乎仍然太长(3/4 行)。
我知道我可以自己编写一个系统来创建只读属性,但我想避免重新发明轮子。
我想知道是否有特殊功能可以执行以下操作:
create_ro_property(self,"foo","_foo",42) # where 42 is the initial value of 42
这将创建一个只读的 属性 foo
,可以通过 _foo
.
有什么想法吗?
您可以按如下方式进行:
class Foo(object):
foo = property(lambda self: self._foo)
@
只是语法糖,lambda
可以代替如此琐碎的 def
来创建 getter。
请注意,这不会设置 42
的初始值;你仍然必须这样做,例如在 __init__
。或者,也许你可以在 __getattr__
到 return None
中做一些聪明的事情来弥补以 _
开头的缺失属性,然后使 return 值 self._foo or 42
(或者,如果 0
是有效值,则 42 if self._foo is None else self._foo
)。