如果这是一个愚蠢的问题我很抱歉,
如果我们有
x=3+5j
然后
x.imag
会给出它想象中的部分
x.conjugate()
会给它复杂的共轭。为什么我们需要设置()
来调用共轭函数?
我在想是否可以认为x
是C ++中的结构
imag
是x
的公共属性,其中conjugate
是成员函数。这种思维方式是否正确?如果这没有意义,我道歉。不可否认,我对C ++和Python的了解非常有限。
答案 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