“a”是什么;方法“;用Python?

“a”是什么;方法“;用Python?,python,methods,Python,Methods,谁能用非常简单的术语向我解释一下Python中的“方法”是什么 在许多面向初学者的Python教程中,这个词的使用方式就像初学者已经知道Python上下文中的方法一样。虽然我当然熟悉这个词的一般含义,但我不知道这个词在Python中的含义。所以,请给我解释一下“Pythonian”方法是关于什么的 一些非常简单的示例代码将非常受欢迎,因为一张图片胜过千言万语。它是一个类的成员函数: class C: def my_method(self): print("I a

谁能用非常简单的术语向我解释一下Python中的“方法”是什么

在许多面向初学者的Python教程中,这个词的使用方式就像初学者已经知道Python上下文中的方法一样。虽然我当然熟悉这个词的一般含义,但我不知道这个词在Python中的含义。所以,请给我解释一下“Pythonian”方法是关于什么的


一些非常简单的示例代码将非常受欢迎,因为一张图片胜过千言万语。

它是一个类的成员函数:

class C:
    def my_method(self):
        print("I am a C")

c = C()
c.my_method()  # Prints("I am a C")
就这么简单


(还有一些可选的方法,允许您控制类和函数之间的关系。但我从您的问题中猜测,您不是在问这个问题,而是在问基本问题。)

方法是一个函数,它将类实例作为其第一个参数。方法是类的成员

class C:
    def method(self, possibly, other, arguments):
        pass # do something here
正如您想知道它在Python中的具体含义一样,可以区分绑定方法和未绑定方法。在Python中,所有函数(以及方法)都是可以传递和“使用”的对象。因此,未绑定方法和绑定方法之间的区别是:

1) 绑定方法

# Create an instance of C and call method()
instance = C()

print instance.method # prints '<bound method C.method of <__main__.C instance at 0x00FC50F8>>'
instance.method(1, 2, 3) # normal method call

f = instance.method
f(1, 2, 3) # method call without using the variable 'instance' explicitly
print C.method # prints '<unbound method C.method>'
instance = C()
C.method(instance, 1, 2, 3) # this call is the same as...
f = C.method
f(instance, 1, 2, 3) # ..this one...

instance.method(1, 2, 3) # and the same as calling the bound method as you would usually do
当您访问
C.method
(类中的方法而不是实例中的方法)时,您将得到一个未绑定的方法。如果要调用它,必须将实例作为第一个参数传递,因为该方法未绑定到任何实例

了解了这一差异,您可以将函数/方法用作对象,就像传递方法一样。作为一个示例用例,假设一个API允许您定义回调函数,但您希望提供一个方法作为回调函数。没问题,只需将
self.myCallbackMethod
作为回调传递,它将以实例作为第一个参数自动调用。在C++等静态语言中(或者只使用欺骗),这是不可能的。 希望你明白我的意思;)我认为这就是关于方法基础知识的所有知识。您还可以阅读更多关于
类方法
静态方法
装饰器的内容,但这是另一个主题。

对不起,但是——在我看来——RichieHindle说这种方法是完全正确的


它是一个类的成员函数

下面是成为类成员的函数的示例。从那时起,它就表现为类的方法。让我们从一个参数的空类和普通函数开始:

>>> class C:
...     pass
...
>>> def func(self):
...     print 'func called'
...
>>> func('whatever')
func called
>>> afunc('whatever')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method func() must be called with A instance as first 
  argument (got str instance instead)
现在我们向
C
类添加一个成员,该类是对函数的引用。之后,我们可以创建类的实例并调用其方法,就好像它是在类中定义的一样:

>>> C.func = func
>>> o = C()
>>> o.func()
func called
我们还可以使用调用该方法的替代方法:

>>> C.func(o)
func called
o.func
甚至以与类方法相同的方式显示:

>>> o.func
<bound method C.func of <__main__.C instance at 0x000000000229ACC8>>
事实是,该方法不接受“whatever”参数:

>>> class C:
...     pass
...
>>> def func(self):
...     print 'func called'
...
>>> func('whatever')
func called
>>> afunc('whatever')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method func() must be called with A instance as first 
  argument (got str instance instead)
>>afunc('whatever')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:必须首先使用实例调用未绑定的方法func()
参数(改为获取str实例)
我的意思是,这不是反对方法是作为类成员的函数的论点

后来发现基本上是相同的。对不起,如果你认为它是重复的:

< P>

通常,方法在绑定后立即调用:

x.f()
在MyClass示例中,这将返回字符串“hello world”。 但是,没有必要立即调用方法:x.f是一个 方法对象,并且可以存储起来并在以后调用。对于 例如:

xf = x.f
while True:
    print xf()
将继续打印hello world,直到时间结束

调用一个方法时会发生什么?你可能已经注意到了 调用x.f()时没有使用上述参数,即使 f()的函数定义指定了一个参数。发生什么事了 争论?当函数 要求在调用参数时不使用任何参数-即使参数 实际上没有使用

事实上,你可能已经猜到了答案:关于 方法是将对象作为 功能。在我们的示例中,调用x.f()与 MyClass.f(x)。通常,使用n个参数的列表调用方法 相当于使用参数调用相应的函数 通过将方法的对象插入到第一个 争论

如果您仍然不了解方法的工作原理,请查看 实施或许可以澄清问题。当一个实例属性 如果引用的不是数据属性,则将搜索其类。如果 名称表示一个有效的类属性,它是一个函数对象,一个 方法对象是通过打包(指向)实例对象而创建的 和函数对象一起出现在一个抽象对象中: 这是方法对象。当使用 参数列表,从实例构造一个新的参数列表 对象和参数列表,并使用 这是一个新的参数列表


在Python中,方法是一个函数,由于对象的类型,该函数可用于给定对象

例如,如果创建
my_list=[1,2,3]
,则
append
方法可以应用于
my_list
,因为它是一个Python列表:
my_list.append(4)
。所有列表都有一个
append
方法,因为它们是列表

另一个例子是,如果创建
my_string='some lowercase text'
,则
upper
方法可以应用于
my_string
,因为它是Python字符串:
my_string.upper()

列表没有

import math
math.sqrt(81)
my_toyota.drive(shop)
my_toyota.load([milk, butter, bread]
class Car(vehicle)
    n_wheels = 4

    load(self, stuff):
    '''this is a method, to load stuff into the trunk of the car'''
        self.open_trunk
        self.trunk.append(stuff)
        self.close_trunk
my_toyota = Car(red)
my_shopping = [milk, butter, bread]
my_toyota.load(my_shopping)