2017-12-03 184 views
2

我是python(来自C++世界)的新手,正在尝试使用类方法。我创建了一个没有任何参数的方法(在这种情况下有目的地避免了self参数)。然后我试图把它调用没有结构的python类方法

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 <__main__.car object at 0x005D2290>

任何人能解释这是怎么回事。我如何“调用”car_method?如果没有办法调用car_method,为什么python让我定义没有任何参数的方法?

我想在这里掌握一些基础知识。我甚至可以将car_method作为类方法调用吗?或者它只是在类中定义的方法?

+0

在写最后一句话'我甚至可以称之为car_method作为类方法?或者它只是在类内部定义的一个方法而已',我意识到可能它的行为是不同的,经过进一步的实验,我意识到,它确实是一个类方法,可以在类中使用,但不喜欢'self.car_method )'。这仍然会导致错误。但是如果将它称为'car_method()',就可以正常工作,前提是你不要在任何其他类方法中使用它!它可以用作类属性! – legameeternoforall

回答

0

在python类的方法是通过这样定义:

class MyObj(object): 

    def my_method(self): 
     pass 

总是至少一个第一参数,它是该实例本身。

2

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

Python中的一般做法是将类方法中的第一个参数命名为self,它类似于C和Java类语言中的this。唯一的区别是,它不是保留关键字,您可以任何名称。尽管使用self是一个通用惯例,因为它对Python程序员和Python文档,IDE解析器更具可读性。 Read the docs

您可以使用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()

为什么Python的允许创建car_method即使自我作为参数传递?

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

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

+0

感谢您的回应,你提到的是'classmethod'和'staticmethod',但我想知道什么是一个类中的方法,而不是它们之一?它的行为如何,其优点/用途以及我如何称呼它?我在发布帖子后添加了评论,所以请评论一下。我很想知道这一点! – legameeternoforall

+0

@legameeternoforall在答案中增加了一个示例。我建议你阅读我附加的文档。它为Python中的OOP提供了一个非常好的开始。 –

+0

@legameeternoforall如果您觉得这对您有用,请随时[接受我的回答](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 :-) –

相关问题