Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使属性只读的较短方法_Python_Class_Properties_Readonly_Readability - Fatal编程技术网

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
,以便它忽略更改某些属性的尝试。它是从类外部只读的,但这并不意味着它可以由类本身更改;)但我喜欢你的第一次尝试。谢谢它是从类外部只读的,但这并不意味着它可以由类本身更改;)但我喜欢你的第一次尝试。谢谢