Python 为什么有些函数需要()而有些函数不需要';T

Python 为什么有些函数需要()而有些函数不需要';T,python,Python,如果这是一个愚蠢的问题,我很抱歉,但是 如果我们有 x=3+5j 然后 x.imag将给出其虚部 x.conjugate()将给出其复数共轭。为什么我们需要放置一个()来调用共轭函数 我在想x是否可以被认为是C中的一个结构++ imag是x的公共属性,其中conjugate是成员函数。这种想法正确吗?如果这毫无意义,我道歉。不可否认,我对C++和Python的认识都是相当有限的。 代码> x>代码>不是结构>代码>,是 >复杂< 的对象< /代码>(尽管有时有助于将代码< >对象< /代码>

如果这是一个愚蠢的问题,我很抱歉,但是

如果我们有

x=3+5j
然后
x.imag
将给出其虚部
x.conjugate()
将给出其复数共轭。为什么我们需要放置一个
()
来调用共轭函数

我在想
x
是否可以被认为是C中的一个结构++


imag
x
的公共属性,其中
conjugate
是成员函数。这种想法正确吗?如果这毫无意义,我道歉。不可否认,我对C++和Python的认识都是相当有限的。

<代码>代码> x>代码>不是<代码>结构>代码>,是<代码> >复杂< <代码>的<代码>对象< /代码>(尽管有时有助于将代码< >对象< /代码> s作为绑定到它们的方法的<代码>结构> <代码> s。
x.conjugate
是一个函数,因为
callable(x.conjugate)
返回
True
。调用函数时,将括号
()
放在函数后面,函数参数放在括号内。调用时,它返回一个新的
对象
,类型为
complex
,该对象还具有可调用的方法
conjugate

>>> x.conjugate
<built-in method conjugate of complex object at 0x00000000034D2C90>
>>> callable(x.conjugate)
True
>>> x.conjugate()
(3-5j)
>>> type(x.conjugate())
<class 'complex'>
>>> x.conjugate().conjugate()
(3+5j)
>>x
>>>可调用(x.共轭)
真的
>>>x.共轭()
(3-5j)
>>>类型(x.共轭()
>>>x.共轭().共轭()
(3+5j)

x
不是一个
struct
,它是一个
复杂类型的
对象
(尽管有时它有助于将
对象
视为
结构
以及与之绑定的方法)

x.conjugate
是一个函数,因为
callable(x.conjugate)
返回
True
。调用函数时,将括号
()
放在函数后面,函数参数放在括号内。调用时,它返回一个新的
对象
,类型为
complex
,该对象还具有可调用的方法
conjugate

>>> x.conjugate
<built-in method conjugate of complex object at 0x00000000034D2C90>
>>> callable(x.conjugate)
True
>>> x.conjugate()
(3-5j)
>>> type(x.conjugate())
<class 'complex'>
>>> x.conjugate().conjugate()
(3+5j)
>>x
>>>可调用(x.共轭)
真的
>>>x.共轭()
(3-5j)
>>>类型(x.共轭()
>>>x.共轭().共轭()
(3+5j)

因此,除其他问题外,有时还有一些编程函数与数学函数不一样。一般来说,具有函数(基本上就是对象)的结构就是函数始终具有起始上下文的结构

历史上,在对象之前,您必须使用a和B的函数,因此您将创建一个名为
addthing(a,B)
的函数,现在,我们可以在thign上创建一个名为add的函数,这样您就可以执行
a.add(B)
。好啊这些是对象上的函数

但对象也可以有属性。现在一些程序员会告诉你,你不应该有公共的东西,你应该使用getter和setter,然后C#做了一些很棒的事情使之更好:但我喜欢公共属性,所以我可以想象让一个“类”(对象的定义)代表一个坐标或向量,这样我就可以定义它有一个X和一个Y,所以这些不是函数而是属性

Wierd bit 1)但我们有时想做一些含蓄的事情。就像doo
vector=vector\u a+vector\u b
那会很棒吧?好吧,你可以!对象继承基本对象,但对象上的默认
\uuuuuu添加\uuuuu
函数不知道如何将另一个对象添加到一起,因此我可以在对象上实现它。实际上有很多默认函数被称为。。。实际上,编译会将类似于
x=y+z
的内容重写为
x=y.\uuuuu add\uuuuuuz)
。你还能覆盖什么<代码>\uuuu str\uuuuu
是当你把它转换成一个字符串(比如
print(mycoord)
被转换成
print(str(mycoord))
,这反过来就是
print(mycoord.\uu str\uuuuuuuuo())
。还有很多类似比较的东西,这意味着你的对象可以按列表和其他很酷的东西排序

wierd bit 2)好的,有时您希望属性实际上是一个函数。什么?我们通常称之为“接受者和接受者”。它们看起来像一个属性,但实际上是一个函数。。。所以

# in a class...
@property
def x(self):
    """I'm the 'x' property."""
    return self._x

# sometime later...
print(myobject.x) # <-- effectivly calls myobject.x()
#在一个类中。。。
@财产
def x(自我):
“我是‘x’属性。”
返回自我
#过一会儿。。。

print(myobject.x)#因此,除了其他问题之外,有时还有一些编程函数与数学函数不一样。一般来说,具有函数(基本上就是对象)的结构就是函数始终具有起始上下文的结构

历史上,在对象之前,您必须使用a和B的函数,因此您将创建一个名为
addthing(a,B)
的函数,现在,我们可以在thign上创建一个名为add的函数,这样您就可以执行
a.add(B)
。好啊这些是对象上的函数

但对象也可以有属性。现在一些程序员会告诉你,你不应该有公共的东西,你应该使用getter和setter,然后C#做了一些很棒的事情使之更好:但我喜欢公共属性,所以我可以想象让一个“类”(对象的定义)代表一个坐标或向量,这样我就可以定义它有一个X和一个Y,所以这些不是函数而是属性

Wierd bit 1)但我们有时想做一些含蓄的事情。就像doo
vector=vector\u a+vector\u b
那会很棒吧?好吧,你可以!对象继承基本对象,但对象上的默认
\uuuuuu添加\uuuuu
函数不知道如何将另一个对象添加到一起,因此我可以在对象上实现它。实际上有很多默认函数被称为。。。实际上,编译会将类似于
x=y+z
的内容重写为
x=y.\uuuuu add\uuuuuuz)
。你还能做什么
# in a class...
@property
def x(self):
    """I'm the 'x' property."""
    return self._x

# sometime later...
print(myobject.x) # <-- effectivly calls myobject.x()