Python 命令需要()与不需要()的区别是什么?

Python 命令需要()与不需要()的区别是什么?,python,pandas,function,methods,Python,Pandas,Function,Methods,我最近花了太长时间调试一段代码,结果发现问题在于我没有在命令后包含()命令。哪些命令需要()而哪些命令不需要()的逻辑是什么 例如: import pandas as pd col1=['a','b','c','d','e'] col2=[1,2,3,4,5] df=pd.DataFrame(list(zip(col1,col2)),columns=['col1','col2']) df.columns 按预期返回索引(['col1','col2'],dtype='object')。如果

我最近花了太长时间调试一段代码,结果发现问题在于我没有在命令后包含()命令。哪些命令需要()而哪些命令不需要()的逻辑是什么

例如:

import pandas as pd

col1=['a','b','c','d','e']
col2=[1,2,3,4,5]

df=pd.DataFrame(list(zip(col1,col2)),columns=['col1','col2'])

df.columns
按预期返回
索引(['col1','col2'],dtype='object')
。如果我们使用
.columns()
我们会得到一个错误

其他命令则相反:

df.isna()
返回:

    col1    col2
0   False   False
1   False   False
2   False   False
3   False   False
4   False   False
但是
df.isna
返回:

<bound method DataFrame.isna of   col1  col2
0    a     1
1    b     2
2    c     3
3    d     4
4    e     5>

虽然没有抛出错误,但这显然不是我们要寻找的

命令使用()和不使用()的逻辑是什么?

这里我使用pandas作为例子,但我认为这与python更普遍地相关。

因为函数的参数需要括号,而变量不需要括号,这就是为什么它是
list.append()
,但它是
list.items

如果调用不带括号的函数,如
list.append
返回的是函数的描述,不是函数的功能描述,而是的功能描述

对于类,对带有括号的类的调用将启动该类的对象,而对不带括号的类的调用则指向该类本身,这意味着如果要执行
print(SomeClass)
,您将得到
,这是对该类的的描述,如果你调用一个没有括号的函数,你会得到同样的响应

哪些命令使用()而哪些命令不使用()的逻辑是什么

对象需要有一个与之关联的方法,才能使用
()
将其作为函数调用:


因此,不同之处在于,
没有定义
调用
方法,而
索引
数据帧
都有;博士,你必须知道

名义上,paren需要调用函数,而不仅仅是返回一个对象

foo.bar    # get the bar object
foo.bar()  # call the bar object 
可调用对象有一个
\u调用\u
方法。当python看到()时,它知道调用
\uuuuuu调用
。这是在C级完成的

此外,python还有属性的概念。它是一个看起来像常规数据对象的可调用数据对象

class Foo:
    def __init__(self):
        self._foo = "foo"

    @property
    def foo(self):
        return "I am " + self._foo

    @foo.setter
    def foo(self, val):
        assert isinstance(val, str)
        self._foo = val + " you bet"

f = Foo()
f.foo = "Hello"     # calls setter
print(f.foo)        # calls getter
类似地,当python看到数组表示法
foo[1]
时,它将调用对象的
\uuu getitem\uuuuuuu
\uuuuuu setitem\uuuuuuu
方法,并且对象可以以其认为合适的任何方式自由重载该调用

最后,对象本身可以使用
\uuuuu getattr\uuuuu
\uuuu getattribute\uuuuu
\uuuuu setattr\uuuuu
方法拦截属性访问,让一切都悬而未决。事实上,python并不真正知道获取和设置属性意味着什么。它正在调用这些方法。大多数对象只使用从
对象继承的默认版本。如果这个类是用C实现的,那么在后台发生的事情就没有尽头了


Python是一种动态语言,许多软件包都添加了抽象,以便于(?)使用其服务。缺点是,您可能会花更多的时间处理帮助文本和文档。

对象方法与对象属性

对象具有方法和属性。 方法需要一个括号来调用它们——即使该方法不需要参数。
其中as属性类似于变量,随着程序的进行,变量指向对象。您只需按名称调用这些属性(不带括号)。当然,您可能需要根据需要使用对象名来限定方法和属性。

您也可以对类进行注释吗?它们的行为方式是否与函数相同?对于类,如果您使用括号调用一个类,您是在实例化该类中的一个对象,但是如果您调用一个不使用括号的类,它将以与函数相同的方式返回该类的描述,例如
print(TestClass)
将打印类似于
,而
TestClass()
返回该类的对象,该对象包含该类的所有函数和变量,并根据该类的构造函数进行初始化,等等。
class Foo:
    def __init__(self):
        self._foo = "foo"

    @property
    def foo(self):
        return "I am " + self._foo

    @foo.setter
    def foo(self, val):
        assert isinstance(val, str)
        self._foo = val + " you bet"

f = Foo()
f.foo = "Hello"     # calls setter
print(f.foo)        # calls getter