我正在阅读PEP 0008(样式指南),我注意到它建议使用self作为实例方法中的第一个参数,但cls是类方法中的第一个参数.
我已经使用并编写了几个类,但我从未遇到过类方法(嗯,一个将cls作为参数传递的方法).有人能告诉我一些例子吗?
谢谢!
小智 98
创建实例方法时,第一个参数始终是self.您可以将其命名为任何名称,但其含义将始终相同,您应该使用self它,因为它是命名约定.
self(通常)在调用实例方法时隐藏传递; 它表示调用方法的实例.
这是一个名为的类的示例,Inst它具有一个名为的实例方法introduce():
class Inst:
def __init__(self, name):
self.name = name
def introduce(self):
print("Hello, I am %s, and my name is " %(self, self.name))
Run Code Online (Sandbox Code Playgroud)
现在调用这个方法,我们首先需要创建一个类的实例.一旦我们有了一个实例,我们就可以调用introduce()它,实例将自动传递为self:
myinst = Inst("Test Instance")
otherinst = Inst("An other instance")
myinst.introduce()
# outputs: Hello, I am <Inst object at x>, and my name is Test Instance
otherinst.introduce()
# outputs: Hello, I am <Inst object at y>, and my name is An other instance
Run Code Online (Sandbox Code Playgroud)
如你所见,我们没有传递参数self,它会被句点运算符隐藏传递; 我们调用Inst类的实例方法introduce,参数为myinst或otherinst.这意味着我们可以调用Inst.introduce(myinst)并获得完全相同的结果.
类方法的想法与实例方法非常相似,唯一的区别在于,我们现在将类本身作为第一个参数传递,而不是将实例隐藏地作为第一个参数传递.
class Cls:
@classmethod
def introduce(cls):
print("Hello, I am %s!" %cls)
Run Code Online (Sandbox Code Playgroud)
由于我们只将一个类传递给该方法,因此不涉及任何实例.这意味着我们根本不需要实例,我们将类方法称为静态函数:
Cls.introduce() # same as Cls.introduce(Cls)
# outputs: Hello, I am <class 'Cls'>
Run Code Online (Sandbox Code Playgroud)
请注意,再次Cls隐藏地传递,所以我们也可以说Cls.introduce(Inst)并获得输出"Hello, I am <class 'Inst'>.当我们继承一个类时,这个特别有用Cls:
class SubCls(Cls):
pass
SubCls.introduce()
# outputs: Hello, I am <class 'SubCls'>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
51092 次 |
| 最近记录: |