Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Properties_Decorator - Fatal编程技术网

使用属性装饰器的python类中的属性行为

使用属性装饰器的python类中的属性行为,python,oop,properties,decorator,Python,Oop,Properties,Decorator,我对使用属性装饰器时属性变量在类中的行为感到困惑 请参见此示例: 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.\ux)中的变量尚未在构造函数中“定义”,因此如何为其赋值 其他东西也可以使用,

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

请参见此示例:

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.\ux
)中的变量尚未在构造函数中“定义”,因此如何为其赋值

其他东西也可以使用,例如,使用上面定义的同一个类并向其添加新成员函数:

  def set_val_x(self):
    self.__x = 8765

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

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

Foo类:
def ____;初始(自,条形):
self.bar=bar
my_foo=foo(3)
我的另一件事=6

例如,它是完全合法的。

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

Foo类:
def ____;初始(自,条形):
self.bar=bar
my_foo=foo(3)
我的另一件事=6

例如,是完全合法的。

\uuuuu init\uuuuuu
中,行

self.x = x
不再是

setattr(self, 'x', x)
因为class属性
Example.x
存在。您不再创建实例属性
x
,而是调用

type(self).X.__set__(self, 'x', x)
这将设置实例属性
\uux


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

self.x = x
不再是

setattr(self, 'x', x)
因为class属性
Example.x
存在。您不再创建实例属性
x
,而是调用

type(self).X.__set__(self, 'x', x)
这将设置实例属性
\uux


可以随时创建、修改或删除实例属性。
\uuuuu init\uuuuuu
方法只是一个创建它们的简单方便的地方,因为每次创建实例时都会自动调用它。

Python中不要求必须在构造函数中初始化对象的属性。Python允许您根据需要创建任意属性(除非您正在使用例如
\uuuuuuuuuuuuuuuuuuu
).A属性是通过实例调用时具有特殊行为的类属性。类属性
Example.x
由时间
示例定义得很好。\uuuu init\uuu
从未运行过。Python中不要求必须在构造函数中初始化对象的属性。Python允许您创建任意属性根据需要(除非您正在使用例如
\uuu slots\uuu
)。属性是通过实例调用时具有特殊行为的类属性。类属性
Example.x
由时间
示例定义得很好。\uu init\uu
始终运行。