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

Python中类方法的差异:绑定,未绑定和静态

刘焱
2023-03-14
问题内容

以下类方法有什么区别?

是一个是静态的,另一个不是静态的吗?

class Test(object):
  def method_one(self):
    print "Called method_one"

  def method_two():
    print "Called method_two"

a_test = Test()
a_test.method_one()
a_test.method_two()

问题答案:

在Python,有区别绑定和未绑定的方法。

基本上,是调用成员函数(如method_one),绑定函数

a_test.method_one()

被翻译成

Test.method_one(a_test)

即对未绑定方法的调用。因此,呼叫你的版本method_two将失败,并显示TypeError

>>> a_test = Test() 
>>> a_test.method_two()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: method_two() takes no arguments (1 given) 

你可以使用装饰器更改方法的行为

class Test(object):
    def method_one(self):
        print "Called method_one"

    @staticmethod
    def method_two():
        print "Called method two"

装饰器告诉内置默认元类type(一个类的类,请参见此问题)不为创建绑定方法method_two。

现在,你可以直接在实例或类上调用静态方法:

>>> a_test = Test()
>>> a_test.method_one()
Called method_one
>>> a_test.method_two()
Called method_two
>>> Test.method_two()
Called method_two


 类似资料:
  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py

  • 本文向大家介绍Python中绑定与未绑定的类方法用法分析,包括了Python中绑定与未绑定的类方法用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中绑定与未绑定的类方法。分享给大家供大家参考,具体如下: 像函数一样,Python中的类方法也是一种对象。由于既可以通过实例也可以通过类来访问方法,所以在Python里有两种风格: 未绑定的类方法:没有self 通过类来引用方

  • 问题内容: 我对动态绑定和静态绑定感到非常困惑。我已经读过,在编译时确定对象的类型称为静态绑定,而在运行时确定它的称为动态绑定。 下面的代码会发生什么: 静态绑定还是动态绑定? 这表明什么样的多态性? 问题答案: 您的示例是 动态绑定 ,因为在运行时确定类型是什么,并调用适当的方法。 现在假设您也具有以下两种方法: 即使您更改为 这将打印出来,因为对的调用使用 静态绑定 ,并且编译器仅知道其类型。

  • 相信 Python 程序员多多少少都和我一样遇到过 Method Unbound Error,直译过来就是 “方法未绑定错误”,虽然搜索之后知道了使用 @classmethod 这样的装饰起后就可以解决问题, 但是一直没有得到完全解惑。 我们知道,Python 是一个动态语言,在类的创建过程中甚至实例化以后都能动态地修改其方法、 属性,这种做法通常被称为“Monkey Patching”,虽然我们

  • 本文向大家介绍Python类绑定方法及非绑定方法实例解析,包括了Python类绑定方法及非绑定方法实例解析的使用技巧和注意事项,需要的朋友参考一下 一、绑定方法   1.对象的绑定方法   首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的。下面,我们通过实例,来慢慢解析绑定方法的应用。   从上面的输出结果来看,talk()這个类中的方法,是绑定给对象使用的。下面,我在

  • 我们知道静态绑定发生在私有、静态、最终和重载的方法上,而动态绑定发生在被覆盖的方法上。但是如果我的方法只是公共的,它既不是静态的,也不是覆盖和重载的怎么办? 有人能给我解释一下print()的绑定会怎样,因为它既没有重载也没有被覆盖。