什么是Python中的“示例方法”?

mfuanj7w  于 2022-11-19  发布在  Python
关注(0)|答案(4)|浏览(191)

来自 3. Data model

示例方法

示例方法对象结合了一个类、一个类示例和任何可调用对象(通常是用户定义的函数)。
如果这是一个定义,它意味着什么?
如果不是定义,那么“示例方法”的定义是什么?
“示例方法”与类的方法概念相同吗?
既然有人提出了类方法和静态方法、绑定方法和未绑定方法,让我澄清一下:
我理解类的方法可以是普通方法、类方法或静态方法。我理解通过类或其示例访问的类的方法可以是绑定或函数。我从未听说过“示例方法”。即使看了引号我也不知道它是什么,也不确定它是否与普通方法、类方法或静态方法有关。、或绑定方法或函数。

y53ybaqx

y53ybaqx1#

>>> class Foo:
...     def im_a_method(self):
...         pass
... 
>>> x = Foo()
>>> x.im_a_method
<bound method Foo.im_a_method of <__main__.Foo object at 0x7f4f1993dd30>>

这是一个示例方法对象。它是你在调用一个对象的方法之前,检索它时得到的东西。

vc9ivgsu

vc9ivgsu2#

  • 什么是示例方法?*

示例方法**是一个绑定到类示例的函数。类的示例作为第一个参数隐式传递给示例方法。它本质上属于该特定示例。示例方法是人们使用的“普通”类型的方法。这与分别使用staticmethodclassmethod创建的静态方法或类方法相反。
下面是一个示例方法的示例:

>>> class Class: 
...     def method(self): 
...        pass 

>>> Class.method
<bound method Class.method of <Class object at 0x7f12781c5b70>>

就这么简单。

czfnxgou

czfnxgou3#

你的困惑来自于这个定义到底是关于什么的。术语“示例方法”实际上是用来描述概念(一种在示例上工作的方法--与类方法或静态方法相对)及其技术实现。你引用的定义是关于技术实现的。
如果你想了解这个定义的上下文,你可以阅读this article in the Python wiki,它解释了Python如何在运行时将函数转换为方法。

v2g6jxz6

v2g6jxz64#

示例方法:

  • 可以调用示例和类变量以及示例、类和静态方法。
  • 可以由对象呼叫。
  • 也可以通过类名直接调用,但是当通过类名直接调用时,我们需要将一个参数传递给示例方法,因为self变成了普通参数,它不具有调用示例和类变量以及示例、类和静态方法的能力。
  • 需要self做为第一个参数,否则对象无法呼叫执行严修方法,但执行严修方法仍可以直接由类别名称呼叫,而且名称self是用于惯例中,因此self以外的其他名称仍可以使用。
  • 我还在我对@classmethod vs @staticmethod in Python的回答中解释了**@类方法@静态方法**。

例如,执行严修方法可以透过对象呼叫执行严修和类别变数,以及执行严修、类别和静态方法,如下所示:

class Person:
    x = "Hello"
    def __init__(self, name):
        self.name = name
    
    def test1(self): # Here
        print(self.name) # Instance variable
        print(self.x)    # Class variable
        self.test2()     # Instance method
        self.test3()     # Class method
        self.test4()     # Static method

    def test2(self):
        print("Test2")
        
    @classmethod
    def test3(cls):
        print("Test3")
        
    @staticmethod
    def test4():
        print("Test4")

p = Person("John")
p.test1() # Here

输出量:

John
Hello
Test2
Test3
Test4

而且,示例方法也可以直接通过类名调用,但当直接通过类名调用时,我们需要向示例方法传递一个参数,因为self成为普通参数,它不具有调用示例和类变量以及示例、类和静态方法的能力,如下所示:

# ...

    def test1(self):
        print(self)

# ...

Person.test1("Test1") # Here

输出量:

Test1

并且,如果调用示例和类变量以及示例、类和静态方法,如下所示:

# ...

    def test1(self):
        print(self.name) # Instance variable or
        print(self.x)    # Class variable or
        self.test2()     # Instance method or
        self.test3()     # Class method or
        self.test4()     # Static method

# ...

Person.test1("Test1") # Here

出现以下错误的原因是,self再次成为常规参数,该参数无法调用示例和类变量以及示例、类和静态方法:
属性错误:“string”对象没有属性“name”
属性错误:“str”对象没有属性“x”
属性错误:“str”对象没有属性“test 2”
属性错误:“str”对象没有属性“test 3”
属性错误:“str”对象没有属性“test 4”
并且,如果一个参数未传递给示例方法,如下所示:

# ...

    def test1(self):
        print(self)

# ...

Person.test1() # Here

出现以下错误:
TypeError:test1()缺少1个必需的位置参数:'自我'
而且,示例方法需要self作为第一个参数,否则示例方法不能被对象调用,如下所示:

# ...

    def test1(): # Without "self"
        print("Test1")

# ...

p = Person("John")
p.test1() # Here

然后,出现以下错误:
TypeError:test1()接受0个位置参数,但提供了1个
但是,仍然可以通过类名直接调用示例方法,如下所示:

# ...

    def test1(): # Without "self"
        print("Test1")

# ...

Person.test1() # Here

输出量:

Test1

而且,self的名称在示例方法中按约定使用,因此其他名称(而不是self)仍然有效,如下所示:

# ...
             # Here
    def test1(orange): 
        print(orange.name) # Instance variable
        print(orange.x)    # Class variable
        orange.test2()     # Instance method
        orange.test3()     # Class method
        orange.test4()     # Static method

# ...

p = Person("John")
p.test1()

输出量:

John
Hello
Test2
Test3
Test4

相关问题