首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的“类方法”和“实例方法”是什么?

问Python中的“类方法”和“实例方法”是什么?
EN

Software Engineering用户
提问于 2015-12-29 14:28:55
回答 2查看 85.1K关注 0票数 41

在聊天中有一个关于一个问题的讨论(这个问题本身与这个问题无关),这表明我可能不知道Python。

在我看来,虽然不同语言的术语不同,但我们一般可以将功能归类为:

  • 免费函数
  • 静态方法/静态成员函数
  • 非静态方法/非静态成员函数

显然,在Python中有另一种函数不属于上述类别,一种是方法,但“不知道它的类”。

Python中的“类方法”和“实例方法”是什么?

EN

回答 2

Software Engineering用户

发布于 2015-12-29 14:57:00

,简短的答案,

  • 实例方法知道它的实例(并从它的类)
  • 类方法知道它的类。
  • 静态方法不知道它的类或实例

长答案

类方法

类方法是属于整个类的方法。它不需要一个实例。相反,类将自动作为第一个参数发送。类方法是用@classmethod装饰符声明的。

例如:

代码语言:javascript
复制
class Foo(object):
    @classmethod
    def hello(cls):
        print("hello from %s" % cls.__name__)
Foo.hello()
-> "Hello from Foo"
Foo().hello()
-> "Hello from Foo"

实例方法

另一方面,实例方法需要一个实例才能调用它,而不需要装饰器。这是迄今为止最常见的方法类型。

代码语言:javascript
复制
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装饰器创建的。

代码语言:javascript
复制
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()构造函数创建。

相关问题

票数 56
EN

Software Engineering用户

发布于 2015-12-29 16:34:31

  • “实例方法”是将实例对象作为其第一个参数传递的方法,按照惯例,该参数称为self。这是默认的。
  • “静态方法”是一种没有初始self参数的方法。这是用@staticmethod装饰师实现的。
  • “类方法”是一种方法,其中初始参数不是实例对象,而是类对象(类对象是“类对象”的请参阅Python文档的这一部分),按照惯例,类对象称为类对象( cls )。这是用@classmethod装饰师实现的。

C/C++/etc中“静态方法”一词的典型用法既适用于Python“静态”方法,也适用于Python "class“方法,因为这两种类型的方法都缺乏对实例的引用。在C/C++/etc中,方法通常可以隐式访问类的所有非实例成员/方法,这可能就是为什么这种区别只存在于Python/Ruby/etc等语言中。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/306092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档