调用没有结构的python类方法
我是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作为类方法调用吗?或者它只是在类中定义的方法?
回答:
在python类的方法是通过这样定义:
class MyObj(object): def my_method(self):
pass
总是至少一个第一参数,它是该实例本身。
回答:
在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
以上是 调用没有结构的python类方法 的全部内容, 来源链接: utcz.com/qa/259929.html