python-奇怪的行为问题 >>类S(对象): ... 定义初始化(自): ... self.x=1 ... def x(自我): ... 返回self.x ... >>>s=s() >>>s.x 1. >>>s.x() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“int”对象不可调用

python-奇怪的行为问题 >>类S(对象): ... 定义初始化(自): ... self.x=1 ... def x(自我): ... 返回self.x ... >>>s=s() >>>s.x 1. >>>s.x() 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:“int”对象不可调用,python,scope,instantiation,Python,Scope,Instantiation,在这个例子中,为什么s.x既是一个方法,又是一个整数?在我看来,self.x=1应该在实例化期间替换属性x的def x(self):声明。为什么我可以获取和调用相同的属性,从而分别得到一个整数和一个方法?我猜想新样式类中的变量查找模式是duck类型的,以便将最相关的结果返回给调用方。我很想听听整个故事。看起来你对所看到的错误有误解。当实例化s对象时,其构造函数将方法x替换为整数,因此在s对象中,x是整数,而不是函数。尝试将其作为方法调用会导致引发异常 Python是duck类型的,因为方法调用是

在这个例子中,为什么
s.x
既是一个方法,又是一个整数?在我看来,
self.x=1
应该在实例化期间替换属性
x
def x(self):
声明。为什么我可以获取和调用相同的属性,从而分别得到一个整数和一个方法?我猜想新样式类中的变量查找模式是duck类型的,以便将最相关的结果返回给调用方。我很想听听整个故事。

看起来你对所看到的错误有误解。当实例化
s
对象时,其构造函数将方法
x
替换为整数,因此在
s
对象中,
x
是整数,而不是函数。尝试将其作为方法调用会导致引发异常


Python是duck类型的,因为方法调用是在运行时解决的-编译器对
s.x()
没有问题,因为
x
可能是作为一个方法动态创建的。然而,当解释器实际调用
x
作为一种方法时,它注意到
x
是一个整数,无法调用,因此
TypeError

看起来您对看到的错误有误解。当实例化
s
对象时,其构造函数将方法
x
替换为整数,因此在
s
对象中,
x
是整数,而不是函数。尝试将其作为方法调用会导致引发异常


Python是duck类型的,因为方法调用是在运行时解决的-编译器对
s.x()
没有问题,因为
x
可能是作为一个方法动态创建的。然而,当解释器实际调用
x
作为一种方法时,它注意到
x
是一个整数,不能被调用,因此
类型错误

我不确定您认为是怎么回事,但没有什么棘手的事情发生。当您分配
self.x=1
时,无法再访问方法
x
。从那以后,
s.x
仅仅是一个整数——尝试将其作为一个方法调用会导致异常,正如您所看到的。

我不确定您认为发生了什么,但没有发生任何棘手的事情。当您分配
self.x=1
时,无法再访问方法
x
。从那时起,
s.x
只是一个整数——尝试将其作为方法调用会导致异常,如您所见。

似乎在类定义中将x属性定义为方法。然而,实际实例化一个对象会用一个整数覆盖该名称-因此,观察到的行为。事实上,它从来不是同时两个。因此,这基本上是一些错误的代码。

似乎x属性在类定义中被定义为一个方法。然而,实际实例化一个对象会用一个整数覆盖该名称-因此,观察到的行为。事实上,它从来不是同时两个。因此,这基本上是一些错误的代码。

Python没有为可调用和不可调用的对象使用单独的空格:名称就是名称就是名称
s.x
,根据Python规则,必须引用完全相同的对象,无论您是否要调用它。另一种说法是:假设
\u aux
是一个未使用的名称

>>> class S(object):
...     def __init__(self):
...             self.x = 1
...     def x(self):
...             return self.x
...
>>> s = S()
>>> s.x
1
>>> s.x()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

必须在Python中具有完全相同的语义,在前者中,中间值
self.x
被绑定到一个名称,稍后调用

为可调用和非可调用使用单一的“统一”名称空间有着巨大的优势——它使名称查找规则(对于每个裸名称和限定名称)变得非常简单,例如,通过将它们与要查找的名称的用途完全分离(无论是在查找结果之后,还是之后),以及根据查找规则第一次引用的任何对象的类型(可调用或不可调用)


特别是考虑到Python有多少不同的可调用类型(函数、类、定义
的类的实例、staticmethod
classmethod
,…!-),任何其他规则都只能导致完全混乱。(也请注意,甚至C++,一种绝对不受复杂性影响的语言,但它也允许类实例可调用[[如果类重载<代码>操作程序)< /代码> ],使用了类似的统一名称空间规则——同样,区分可调用和非可调用将是一场毫无根据的噩梦,如果规则在这方面有所不同的话.

Python对可调用对象和不可调用对象不使用单独的空格:名称就是名称。
s.x
,根据Python规则,必须引用完全相同的对象,无论您是否要调用它。另一种说法是:假设
\u aux
是一个未使用的名称

>>> class S(object):
...     def __init__(self):
...             self.x = 1
...     def x(self):
...             return self.x
...
>>> s = S()
>>> s.x
1
>>> s.x()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

必须在Python中具有完全相同的语义,在前者中,中间值
self.x
被绑定到一个名称,稍后调用

为可调用和非可调用使用单一的“统一”名称空间有着巨大的优势——它使名称查找规则(对于每个裸名称和限定名称)变得非常简单,例如,通过将它们与查找名称的目的完全分离
self.x()
>>> class S(object):
...     def __init__(self):
...         self.x = 1
...     def x(self):
...         return self.x
... 
>>> s = S()
>>> s.x
1
>>> S.x(s)
1
>>>