1.类的方法第一个参数必须是 self,并且如果要调用类的方法,必须将通过类的实例,即方法绑定实例后才能由实例调用。如果不绑定,一般在继承关系的类之间,可以用 super 函数等方法调用。
2.这里再介绍一种方法,这种方法的调用方式跟上述的都不同,这就是:静态方法和类方法
看代码:
__metaclass__ = type
class StaticMethod:
@staticmethod
def foo():
print("This is static method foo().")
class ClassMethod:
@classmethod
def bar(cls):
print("This is class method bar()")
print("bar() is part of class:", cls.__name__)
if __name__ == "__main__":
static_foo = StaticMethod() # 实例化
static_foo.foo() # 实例调用静态方法
StaticMethod.foo() # 通过类来调用静态方法
print("*****")
class_bar = ClassMethod()
class_bar.bar()
ClassMethod.bar()
运行结果:
This is static method foo().
This is static method foo().
*****
This is class method bar()
bar() is part of class: ClassMethod
This is class method bar()
bar() is part of class: ClassMethod
- @staticmethod 表示下面的方法是静态方法。
- @classmethod 表示下面的方法是类方法
- 先看静态方法,虽然名为静态方法,但也是方法,所以,依然用 def 语句来定义。需要注意的是文件名后面的括号内,没有 self,这和前面定义的类中的方法是不同的,也正是因着这个不同,才给它另外取了一个名字叫做静态方法,否则不就“泯然众人矣”。如果没有 self,那么也就无法访问实例变量、类和实例的属性了,因为它们都是借助 self 来传递数据的。
- 再看类方法,同样也具有一般方法的特点,区别也在参数上。类方法的参数也没有 self,但是必须有 cls 这个参数。在类方法中,能够访问类属性,但是不能访问实例属性。
- 简要明确两种方法。两种方法都可以通过实例调用,即绑定实例。也可以通过类来调用,即 StaticMethod.foo() 这样的形式,这也是区别一般方法的地方,一般方法必须用通过绑定实例调用。