类的方法就是类中定义的函数方法。类中的函数有三种情况:静态方法、类方法、实例方法。通过分类,分出了各个方法作用的不同范围。
class Foo(object):
"""类三种方法语法形式"""
def instance_method(self):
print("是类{}的实例方法,只能被实例对象调用".format(Foo))
@staticmethod
def static_method():
print("是静态方法")
@classmethod
def class_method(cls):
print("是类方法")
用类的实例可以访问类中的所有三种方法,实例方法最大的特点就是,它最少也要包含一个 self 参数,用于绑定调用此方法的实例对象(Python 会自动完成绑定)。实例方法通常会用类的实例对象直接调用:
foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
输出:
是类<class ‘__main__.Foo‘>的实例方法,只能被实例对象调用
是静态方法
是类方法
用类名可以访问静态方法
Foo.static_method()
输出
是静态方法
#如果用类名去访问实例方法
Foo.instance_method()
输出:
TypeError: instance_method() missing 1 required positional argument: ‘self‘
#不能通过类名直接去访问实例方法。但是如果非要访问,可以这么做:
#foo = Foo()
#Foo.instance_method(fool) 这么做效果和foo.instance_method()一样,但是显得没有必要
#如果用类名去访问类方法,可以正常访问。
Foo.class_method()
输出:
是类方法
由于Python类中只能有一个初始化方法 def __init__(self)
,不能按照不同的情况初始化类。
class Book(object):
def __init__(self, title):
self.title = title
@classmethod
def create(cls, title):
book = cls(title=title)
return book
book1 = Book("python")
book2 = Book.create("python and django")
print(book1.title)
print(book2.title)
类方法中通常将参数命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。
和实例方法最大的不同在于,类方法需要使用@classmethod
修饰符进行修饰,如果没有 @classmethod,则 Python 解释器会将 类方法认定为实例方法,而不是类方法。
虽然,实例化的对象也能调用类方法,但是不这么做。
原文:https://www.cnblogs.com/lanhuakai/p/14647581.html