当前位置: 首页 > 面试题库 >

Python-静态方法和类方法之间的区别

商柏
2023-03-14
问题内容

@staticmethod修饰的功能和用修饰的功能有什么区别@classmethod


问题答案:

也许有点示例代码将有助于:发现其中的差别在调用签名fooclass_foo并且static_foo

class A(object):
    def foo(self, x):
        print "executing foo(%s, %s)" % (self, x)

    @classmethod
    def class_foo(cls, x):
        print "executing class_foo(%s, %s)" % (cls, x)

    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)" % x    

a = A()

以下是对象实例调用方法的常用方法。对象实例,a作为第一个参数隐式传递。

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>,1)

使用classmethods时,对象实例的类作为第一个参数而不是隐式传递self

a.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

你也可以class_foo使用该类进行呼叫。实际上,如果你将某些东西定义为类方法,则可能是因为你打算从类而不是从类实例调用它。A.foo(1)本来会引发TypeError,但A.class_foo(1)效果很好:

A.class_foo(1)
# executing class_foo(<class '__main__.A'>,1)

人们发现类方法的一种用途是创建可继承的替代构造函数。

使用staticmethods时,self(对象实例)和 cls(类)都不会隐式传递为第一个参数。它们的行为类似于普通函数,只是你可以从实例或类中调用它们:

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

静态方法用于对与类之间具有某种逻辑联系的函数进行分组。

foo只是一个函数,但是当你调用a.foo它时,不仅获得该函数,还会获得该函数的“部分应用”版本,该对象实例a绑定为该函数的第一个参数。foo期望有2个参数,而a.foo只期望有1个参数。

afoo绑定。这就是下面“绑定”一词的含义:

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

a.class_fooa不绑定class_foo,而是与类A绑定class_foo

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

在这里,使用静态方法,即使它是一种方法,也a.static_foo只返回一个没有参数绑定的良好的'ole函数。static_foo期望有1个参数,也 a.static_foo期望有1个参数。

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

当然,当你static_foo使用类进行调用时,也会发生同样的事情A

print(A.static_foo)
# <function static_foo at 0xb7d479cc>


 类似资料:
  • 问题内容: 在Java中同步静态方法和非静态方法有什么区别?有人可以举例说明吗?在同步方法和同步代码块方面也有什么区别吗? 问题答案: 我将尝试添加示例以使这一点更加清楚。 如前所述,Java中的同步是Monitor概念的实现。当您将代码块标记为同步时,可以使用一个对象作为参数。当执行线程进入这样的代码块时,它必须首先等待,直到同一对象上的同步块中没有其他执行线程。 在上面的示例中,一个正在运行的

  • 本文向大家介绍静态方法和类方法区别?相关面试题,主要包含被问及静态方法和类方法区别?时的应答技巧和注意事项,需要的朋友参考一下 尽管 classmethod 和 staticmethod 非常相似,但在用法上依然有一些明显的区别。classmethod 必须有一个指向类对象的引用作为第一个参数,而 staticmethod 可以没有任何参数。 举个栗子:

  • 问题内容: 我只是在阅读教科书中给我的课文,我不确定自己是否明白我在说什么。这基本上是在告诉我静态方法或类方法包括关键字“修饰符” static。但是我真的不知道那意味着什么吗? 有人可以简单地向我解释什么是静态方法或类方法吗? 另外,我可以简单解释一下什么是Instance方法吗? 这是他们在教科书中给我的: 存在或不存在静态修饰符具有重要的实际意义。一旦Java处理了它所属的类的定义,就可以调

  • 本文向大家介绍python的类方法和静态方法,包括了python的类方法和静态方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python的类方法和静态方法。分享给大家供大家参考。具体分析如下: python没有和C++中static关键字,它的静态方法是怎样的呢?还有其它语言中少有的类方法又是神马? python中实现静态方法和类方法都是依赖于python的修饰器来实现的。 大家注意

  • 主要内容:Python类实例方法,Python类方法,Python类静态方法和类属性一样,类方法也可以进行更细致的划分,具体可分为 类方法、 实例方法和 静态方法。 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。 其中 @classmethod 和 @staticmethod 都是函数装饰器,后续章节会对其做详

  • 在讲类方法和静态方法之前,先来看一个简单的例子: class A(object): def foo(self): print 'Hello ', self >>> a = A() >>> a.foo() Hello, <__main__.A object at 0x10c37a450> 在上面,我们定义了一个类 A,它有一个方法 foo,然后我们创建了一个对象 a,并调用