【问题标题】:Attribute behaviour in python class using property decorator使用属性装饰器的python类中的属性行为
【发布时间】:2020-10-07 11:20:33
【问题描述】:

我对使用属性装饰器时属性变量在我的类中的行为方式感到困惑。

看这个例子:

class Example:
  def __init__(self, x):
    self.x = x

  @property
  def x(self):
    return self.__x

  @x.setter
  def x(self, x):
    self.__x = x

这很好用,但是怎么做呢? setter属性内的变量(self.__x)还没有在构造函数中“定义”,那怎么赋值呢?

其他东西也可以,例如,采用上面定义的相同类并为其添加新的成员函数:

  def set_val_x(self):
    self.__x = 8765

同样,使用这个函数实际上是有效的,类似于 property.setter(但它没有使用属性装饰器)。

【问题讨论】:

  • Python 中没有要求必须在构造函数中初始化对象的属性。
  • Python 允许您根据需要创建任意属性(除非您使用例如 __slots__)。
  • 属性是一个 class 属性,当通过实例调用时具有特殊行为。 Example.x 的类属性在 Example.__init__ 运行时已经很好地定义了。

标签: python oop properties decorator


【解决方案1】:

在 Python 中,您不必在构造函数中定义变量。您可以随时分配它们。

class Foo:
    def __init__(self, bar):
        self.bar = bar
my_foo = Foo(3)
my_foo.other_thing = 6

例如是完全合法的。

【讨论】:

  • ? 谢谢!我现在明白了。
【解决方案2】:

__init__ 内,一行

self.x = x

不再是

的缩写
setattr(self, 'x', x)

因为类属性Example.x 存在。你不再创建实例属性x,而是调用

type(self).X.__set__(self, 'x', x)

这将设置实例属性__x

可以随时创建、修改或删除实例属性。 __init__ 方法只是一个方便的单一位置来创建它们,因为每次创建实例时都会自动调用它。

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2018-07-06
    • 1970-01-01
    • 2019-10-29
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2016-07-30
    相关资源
    最近更新 更多