在聊天中有一个关于一个问题的讨论(这个问题本身与这个问题无关),这表明我可能不知道Python。
在我看来,虽然不同语言的术语不同,但我们一般可以将功能归类为:
显然,在Python中有另一种函数不属于上述类别,一种是方法,但“不知道它的类”。
Python中的“类方法”和“实例方法”是什么?
发布于 2015-12-29 14:57:00
长答案
类方法是属于整个类的方法。它不需要一个实例。相反,类将自动作为第一个参数发送。类方法是用@classmethod装饰符声明的。
例如:
class Foo(object):
@classmethod
def hello(cls):
print("hello from %s" % cls.__name__)
Foo.hello()
-> "Hello from Foo"
Foo().hello()
-> "Hello from Foo"另一方面,实例方法需要一个实例才能调用它,而不需要装饰器。这是迄今为止最常见的方法类型。
class Foo(object):
def hello(self):
print("hello from %s" % self.__class__.__name__)
Foo.hello()
-> TypeError: hello() missing 1 required positional argument: 'self'(注意:上面提到的是python3;使用python2,您将得到一个稍微不同的错误)
静态方法类似于类方法,但不会将类对象作为自动参数。它是通过使用@staticmethod装饰器创建的。
class Foo(object):
@staticmethod
def hello(cls):
print("hello from %s" % cls.__name__)
Foo.hello()
-> TypeError: hello() missing 1 required positional argument: 'cls'下面是指向相关python3文档的链接:
关于类方法和静态方法之间的区别,数据模型文档有这样的说法:
静态方法对象静态方法对象提供了一种避免将函数对象转换为上述方法对象的方法。静态方法对象是任何其他对象的包装器,通常是用户定义的方法对象.当从类或类实例检索静态方法对象时,实际返回的对象是包装对象,不受任何进一步转换的限制。静态方法对象本身是不可调用的,尽管它们包装的对象通常是可调用的。静态方法对象是由内置的静态方法()构造函数创建的。类方法对象类方法对象与静态方法对象一样,是另一个对象的包装器,它改变了从类和类实例中检索对象的方式。在上述“用户定义方法”下描述了类方法对象在这种检索上的行为。类方法对象由内置的classmethod()构造函数创建。
发布于 2015-12-29 16:34:31
self。这是默认的。self参数的方法。这是用@staticmethod装饰师实现的。cls )。这是用@classmethod装饰师实现的。C/C++/etc中“静态方法”一词的典型用法既适用于Python“静态”方法,也适用于Python "class“方法,因为这两种类型的方法都缺乏对实例的引用。在C/C++/etc中,方法通常可以隐式访问类的所有非实例成员/方法,这可能就是为什么这种区别只存在于Python/Ruby/etc等语言中。
https://softwareengineering.stackexchange.com/questions/306092
复制相似问题