【问题标题】:Calling python class method which has no argument调用没有参数的python类方法
【发布时间】:2018-05-16 21:51:37
【问题描述】:

我是 python 新手(来自 c++ 世界)并且正在尝试使用类方法。我创建了一个没有任何参数的方法(在这种情况下故意避免使用 self 参数)。然后我尝试调用它

class car:

    def car_method():
        print("Inside Car method")


obj = car_method()
obj.car_method()    <---- this creates error: TypeError: car_method() takes 0 positional arguments but 1 was given

我认为这个错误是因为,在 Python 中,每个类方法在调用时总是传递至少一个参数,即该对象的引用。我说的对吗?

然后为了进一步实验,我写了

obj.car_method      <----- assuming I am not passing any argument to it

但该函数什么也没打印。

然后我尝试使用它打印它的类型

print(obj.car_method)

导致

bound method car.car_method of &lt;__main__.car object at 0x005D2290&gt;

谁能解释这里发生了什么?我如何“调用” car_method?如果没有办法调用car_method,为什么python让我不带任何参数地定义方法?

我正在努力掌握这里的基础知识。我什至可以将 car_method 称为类方法吗?或者它只是一个类中定义的方法?

【问题讨论】:

  • 在写最后一句Can I even call car_method as a class method? or it is just a method defined inside class?时,我意识到可能是它的行为不同,经过进一步的实验,我意识到,它确实是一个可以在类内部使用但不像@的类方法987654327@。这仍然会出错。但是像car_method() 那样调用它就可以了,只要你不在任何其他类方法中使用它!!!!可以作为类属性使用!!

标签: python python-3.x parameter-passing self class-method


【解决方案1】:

在python中,类的方法是这样定义的:

class MyObj(object):

    def my_method(self):
        pass

总是至少有一个第一个参数是实例本身。

【讨论】:

    【解决方案2】:

    在 Python 中,类的所有方法都隐式地接收类对象的实例作为第一个参数。

    在 Python 中,将类方法中的第一个参数命名为 self 是一种普遍的做法,就像在 C 和类 Java 语言中的 this 一样。唯一的区别是,它不是保留关键字,您可以将其命名为任何名称。尽管使用 self 是一个通用约定,因为它对 Python 程序员和 Python 文档、IDE 解析器更具可读性。 Read the docs.

    您可以使用 self.一个非常简单的例子展示了self的用例:

    In [37]: class car:
        ...:     def __init__(self):
        ...:         self.car_name = 'Jaguar'
        ...:
        ...:     def car_method(self):
        ...:         print("I can access " + self.car_name + " because I have
        ...: self")
        ...:         print("Inside Car method")
        ...:
        ...:     def another_method(self):
        ...:         # this calls car_method
        ...:         self.car_method()
        ...:
    
    In [38]: c = car()
    
    In [39]: c.another_method()
    I can access Jaguar because I have self
    Inside Car method
    

    如果你想要classmethod。你可以在 Python 中定义一个类方法:

    class car:
    
        @classmethod
        def car_method(cls):
            print("Inside Car method")
    

    car_method 方法之上的小东西@classmethod 在Python 中被称为decorator。但即使在类方法中,类实例也是作为 car_method 中的参数传递的。

    如果你想在没有参数的情况下调用你的方法car_method,并且不需要访问类/实例变量(这些被称为静态方法)。您可以使用 @staticmethod 装饰器将您的方法定义为静态方法。

    class car:
    
        @staticmethod
        def car_method():
            print("Inside Car method")
    

    这里没有 self 作为参数传递,您可以将 car_method 称为 car().car_method()

    为什么即使将 self 作为参数传递,Python 也允许创建 car_method?

    这是因为 Python 不像 C 那样是静态类型的。它是一种动态语言。与静态类型语言不同,所有类型、函数参数等检查都发生在 Python 的运行时

    要了解更多关于@classmethod 和@staticmethod 装饰器的信息,read about @classmethod and @staticmethod in this awesome SO thread

    【讨论】:

    • 感谢您的回复,您提到的是classmethodstaticmethod,但我想知道在不是它们的类中的方法是什么?它的行为如何,它的好处/用途以及我如何称呼它?我在发布帖子后添加了评论,所以也请发表评论。我很想知道这个!
    • @legameeternoforall 在答案中添加了一个示例。我建议你阅读我附上的文档。它为 Python 中的 OOP 提供了一个很好的开端。
    • @legameeternoforall 如果您觉得它对您有用,请随时 accept my answer。 :-)
    【解决方案3】:

    要访问car 类中的ca_method(),您只需创建car 类的实例,然后使用该方法。 例如:

    class car:
    
        def car_method():
           print("Inside Car method")
    
    a = car()
    a.car_method()
    

    或者简单地说:

    class car:
        
        def car_method():
               print("Inside Car method")
        
    car().car_method()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多