Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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 如果x不是类绑定或实例绑定变量,self.x如何工作? 如果x不是类绑定或实例绑定变量,self.x如何工作?在这种情况下,使用它有什么好处吗? 我的分析是:_Python_Python 3.x_Performance_Class_Oop - Fatal编程技术网

Python 如果x不是类绑定或实例绑定变量,self.x如何工作? 如果x不是类绑定或实例绑定变量,self.x如何工作?在这种情况下,使用它有什么好处吗? 我的分析是:

Python 如果x不是类绑定或实例绑定变量,self.x如何工作? 如果x不是类绑定或实例绑定变量,self.x如何工作?在这种情况下,使用它有什么好处吗? 我的分析是:,python,python-3.x,performance,class,oop,Python,Python 3.x,Performance,Class,Oop,通常,如果我们执行a.a1=5,解释器将给出NameEror:name a未定义。这意味着我们不能使用字母定义变量,因为它用于调用对象的属性。 如果我把代码写成 a = 5 a.a1 = 10 它给出AttributeError:int对象没有属性x。这是意料之中的。 现在看看我下面的代码 class Example: p = 1 def __init__(self): self.q = 2 def my_function(self):

通常,如果我们执行
a.a1=5
,解释器将给出NameEror:name a未定义。这意味着我们不能使用字母
定义变量,因为它用于调用对象的属性。 如果我把代码写成

a = 5
a.a1 = 10
它给出AttributeError:int对象没有属性
x
。这是意料之中的。 现在看看我下面的代码

class Example:
    p = 1
    def __init__(self):
        self.q = 2
    def my_function(self):
        self.x = 5
        return self.x
obj = Example()
print(obj.my_function())
print(dir(obj), obj.__dict__)

As
x
既不是类绑定变量,也不是实例绑定变量。因此,我假设
x
不是
self
的属性,但它执行成功,没有任何错误。所以我想知道,它是如何工作的。请解释它,同时让我知道它的用途,因为根据解释我们可以使用它。

执行
self.x=5
您只需创建一个新属性,以后可以修改它,就像普通变量一样;除非您通过实例访问它。

执行
self.x=5
您只需创建一个新属性,以后可以修改它,就像普通变量一样;除非您通过实例访问它。

这是定义属性的标准方法。在这里您可以找到关于类和属性的更多信息:

这是定义属性的标准方法。在这里,您可以找到有关类和属性的更多信息:

此时,您正在为类型为
Example
的对象声明并实例化一个新字段。在其他函数中,将引用
self.x
,不会引发错误。未进行任何声明时-将引发运行时错误,例如:

class Example:
    p = 1
    def __init__(self):
        self.q = 2
    def my_function(self):
        self.x = 5
        return self.x
    def other(self):
        return self.x
obj = Example()
print(obj.other())
print(obj.my_function())
这将导致
AttributeError:“Example”对象没有属性“x”


需要记住执行顺序,以便在引用之前声明和实例化字段。

此时,您正在为类型为
Example
的对象声明和实例化一个新字段。在其他函数中,将引用
self.x
,不会引发错误。未进行任何声明时-将引发运行时错误,例如:

class Example:
    p = 1
    def __init__(self):
        self.q = 2
    def my_function(self):
        self.x = 5
        return self.x
    def other(self):
        return self.x
obj = Example()
print(obj.other())
print(obj.my_function())
这将导致
AttributeError:“Example”对象没有属性“x”


需要记住执行顺序,以便在引用之前声明和实例化字段。

谢谢您的回答。但我想知道,创建新属性是否比普通局部变量有任何优势,因为除了创建该属性的方法之外,我们不能在任何地方使用创建的新属性,只有我们可以像普通局部变量一样更新它。创建新属性是利用内存的有效方法吗?事实上你错了,因为变量被重新附加到instanc,它不会消失。谢谢@FrenchMasterSwarm-你是对的,我实际上没有使用正确的执行顺序。现在我明白了。谢谢你的回答。但我想知道,创建新属性是否比普通局部变量有任何优势,因为除了创建该属性的方法之外,我们不能在任何地方使用创建的新属性,只有我们可以像普通局部变量一样更新它。创建新属性是利用内存的有效方法吗?事实上你错了,因为变量被重新附加到instanc,它不会消失。谢谢@FrenchMasterSwarm-你是对的,我实际上没有使用正确的执行顺序。现在我明白了。谢谢@Andronicus-我已经试过了,你是对的。但我想知道,创建新属性是否比普通局部变量有任何优势,因为除了创建该属性的方法之外,我们不能在任何地方使用创建的新属性,只有我们可以像普通局部变量一样更新它。创建新属性是利用内存的有效方法吗?我不认为内存利用率有任何区别。对我来说更重要的是,方法体中的字段实例化会降低代码的可读性,并且更容易出错。这些错误会根据方法调用顺序而提高,这使得它们很难找到。谢谢“安东尼科斯-我现在得到了。没问题:”对于未来,考虑标记正确的答案/投票,以便其他人知道,这是正确的答案。虽然我会说我试图推翻一些答案,但我认为我无法做到这一点,因为我没有至少15个声誉。谢谢@Andronicus-我已经尝试过了,你是对的。但我想知道,创建新属性是否比普通局部变量有任何优势,因为除了创建该属性的方法之外,我们不能在任何地方使用创建的新属性,只有我们可以像普通局部变量一样更新它。创建新属性是利用内存的有效方法吗?我不认为内存利用率有任何区别。对我来说更重要的是,方法体中的字段实例化会降低代码的可读性,并且更容易出错。这些错误会根据方法调用顺序而提高,这使得它们很难找到。谢谢“安东尼科斯-我现在得到了。没问题:”对于未来,考虑标记正确的答案/投票,以便其他人知道,这是正确的答案。虽然我会说我试图推翻一些答案,但我认为我无法做到这一点,因为我没有至少15个声誉。