为什么有些函数需要()但有些函数不需要?

时间:2016-11-17 17:22:48

标签: python

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

如果我们有

x=3+5j

然后 x.imag会给出它想象中的部分 x.conjugate()会给它复杂的共轭。为什么我们需要设置()来调用共轭函数?

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

imagx的公共属性,其中conjugate是成员函数。这种思维方式是否正确?如果这没有意义,我道歉。不可否认,我对C ++和Python的了解非常有限。

2 个答案:

答案 0 :(得分:2)

因此,除了其他问题之外,您有时会使用编程函数与数学函数相同。一般来说,具有函数的结构(基本上就是对象)是函数始终具有起始上下文的位置。

历史上在对象之前,你必须mkae一个带有A和B的函数,所以你要创建一个名为addthing(A, B)的函数,现在,我们可以在thign上创建一个名为add的函数,所以你可以做A.add(B)。好的......这些是对象上的函数

但是对象也可以具有属性。现在一些程序员会告诉你你不应该有公共事物,你应该使用getter和setter,然后C#做了一些很棒的事情来做得更好:但我喜欢公共属性,所以我可以想象创建一个' class' (它是一个对象的定义)代表一个坐标或一个向量,所以我可以定义它有一个X和一个Y,所以这些arn&t; t函数但属性。

Wierd bit 1)但我们有时会隐式地做一些事情。像doo vector = vector_a + vector_b那样真棒吗?好吧,你可以!对象继承基本对象,但对象上的默认__add__函数不知道如何将其中一个添加到一起,所以我可以在我的对象上实现它。实际上有大量这些默认函数被调用...有效的编译会将x = y + z之类的内容重写为x = y.__add__(z)。还有什么可以覆盖? __str__在将其转换为字符串时会被调用(例如print(mycoord)被转换为(有效)转换为print(str(mycoord)),而print(mycoord.__str__())又是# in a class... @property def x(self): """I'm the 'x' property.""" return self._x # sometime later... print(myobject.x) # <-- effectivly calls myobject.x() 。还有很多类似的东西比较,意味着您的对象可以按列表和其他很酷的东西进行排序......

wierd bit 2)好的,有时你想要一个属性实际上是一个函数。 WHAAAAAAT?我们经常称这些为“吸气者和叮咬者”。它们看起来像属性或属性,但它们实际上是一个功能......所以......

⁠⁠⁠⁠kubeadm

现在这意味着你可以在setter上做一些事情,你可以在那里验证输入,控制它的设置,也许强迫它成为一个特定的类型(不是与python的zen完全内联,但有时非常有用)。 / p>

希望有所帮助!

答案 1 :(得分:1)

x不是struct,而是object类型complex(尽管有时将object视为{{1}会有所帮助使用绑定到它们的方法)。

struct

>>> type(x) <class 'complex'> >>> x = 3+5j >>> type(x) <class 'complex'> 不是一个函数,它是x.imag对象attribute的{​​{1}}。不必使用括号x调用float以检索其值。在您的示例中,其值为attribute。您可以通过调用()来测试它是否为函数。 5个对象不可调用。

callable

float 一个函数,因为>>> x.imag 5.0 >>> type(x.imag) <class 'float'> >>> callable(x.imag) False 返回x.conjugate。您可以通过将括号callable(x.conjucate)放在括号内的函数参数来调用该函数。调用后,它会返回True类型的新(),而object类型又可以调用方法complex

conjugate