在Python中,什么是“类方法”和“实例方法”?
“实例方法”使用实例中包含的信息来计算要返回的值(或要执行的副作用)。这些很常见。
“类方法”使用有关类的信息(而不是该类的实例)来影响其功能(它们通常用于创建新实例作为替代构造函数,因此并不常见)。
“静态方法”不使用有关类或实例的任何信息来计算其功能。为了方便起见,通常只在课堂上讲。(因此,它们也不是很常见。)
X的函数
记住数学课,“ y是x的函数f(x)吗?” 让我们在代码中应用它:
y=function(x)
以上所隐含的是,由于x可能会更改,所以y更改时可能会x更改。这就是说“ y是”的功能时的x意思。
将什么y是时候z是1?2?'FooBarBaz'?
y不是的函数z,因此z可以是任何东西,并且假设我们function是纯函数,则不影响该函数的结果。(如果它z作为全局变量访问,则它不是纯函数-这就是函数纯净的含义。)
阅读以下说明时,请牢记以上几点:
实例方法
一个实例方法是函数是一个函数的一个实例。该函数隐式地接受该实例作为其参数,并且该实例由该函数使用以确定该函数的输出。
实例方法的内置示例为str.lower:
>>>'ABC'.lower()'abc'
str.lower 在字符串的实例上调用,并使用实例中包含的信息确定要返回的新字符串。
类方法:
记住,在Python中,一切都是对象。这意味着该类是一个对象,并且可以作为参数传递给函数。
一类方法是一个函数,它是一个函数的类。它接受类作为其参数。
一个内置的示例是dict.fromkeys:
>>>dict.fromkeys('ABC'){'C':None,'B':None,'A':None}
该函数隐式地知道其自己的类,该函数使用该类来影响该函数的输出,并从可迭代对象中创建该类的新类。使用相同的方法时,OrderedDict会对此进行演示:
>>>fromcollectionsimportOrderedDict>>>OrderedDict.fromkeys('ABC')OrderedDict([('A',None),('B',None),('C',None)])
class方法使用有关类的信息(而不是该类的实例)来影响要返回的类的类型。
静态方法
您提到了“不知道其类”的方法-这是Python中的静态方法。它只是为了方便而附加到类对象上。它可以选择是另一个模块中的单独函数,但其调用签名将相同。
静态方法既不是类也不是对象的函数。
静态方法的内置示例是Python 3中的str.maketrans。
>>>str.maketrans('abc','bca'){97:98,98:99,99:97}
给定几个参数,它将创建一个字典,而不是其类的函数。
这很方便,因为str它始终在全局名称空间中可用,因此您可以轻松地将其与translation函数一起使用:
>>>'abracadabra'.translate(str.maketrans('abc','bca'))'bcrbabdbcrb'
在Python 2中,您必须从string模块访问它:
>>>'abracadabra'.translate(str.maketrans('abc','bca'))Traceback(most recent call last):File"",line1,inAttributeError:type object'str'has no attribute'maketrans'>>>importstring>>>'abracadabra'.translate(string.maketrans('abc','bca'))'bcrbabdbcrb'
例
classAClass(object):"""In Python, a class may have several types of methods:instance methods, class methods, and static methods"""defan_instance_method(self,x,y,z=None):"""this is a function of the instance of the objectself is the object's instance"""returnself.a_class_method(x,y)@classmethoddefa_class_method(cls,x,y,z=None):"""this is a function of the class of the objectcls is the object's class"""returncls.a_static_method(x,y,z=z)@staticmethoddefa_static_method(x,y,z=None):"""this is neither a function of the instance or class towhich it is attached"""returnx,y,z
让我们实例化:
>>>instance=AClass()
现在,实例可以调用所有方法:
>>>instance.an_instance_method('x','y')('x','y',None)>>>instance.a_static_method('x','y')('x','y',None)>>>instance.a_class_method('x','y')('x','y',None)
但是该类通常不打算调用该实例方法,尽管希望它可以调用其他方法:
>>>AClass.a_class_method('x','y')('x','y',None)>>>AClass.a_static_method('x','y')('x','y',None)>>>AClass.an_instance_method('x','y')Traceback(most recent call last):File"",line1,inTypeError:an_instance_method()missing1required positional argument:'y'
您必须显式传递实例才能调用实例方法:
>>>AClass.an_instance_method(instance,'x','y')('x','y',None)