上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用)。
静态方法(@staticmethod)
静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法;
说了那么多,估计会有些懵逼,咱们还是直接上代码看下静态方法怎么使用吧!
1.按照正常逻辑编写代码并加上@staticmethod定义静态方法eat:
class People(object): def __init__(self,name): self.name = name @staticmethod #把eat方法变为静态方法 def eat(self): print("%s is eating" % self.name) d = People("houyafan") d.eat()
运行上面代码,我们会发现报以下错误:
TypeError: eat() missing 1 required positional argument: 'self'
----------eat需要一个self参数,但调用时却没有传递
so...我们可以得出一个结论:eat变成静态方法后,再通过实例调用时不会自动把实例本身当作一个参数传给self
2.解决办法:
1)调用时主动传递实例本身给eat方法,即d.eat(d)
class People(object): def __init__(self, name): self.name = name @staticmethod # 把eat方法变为静态方法 def eat(self): print("%s is eating" % self.name) d = People("houyafan") d.eat(d) #------打印输出------ #houyafan is eating
2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)
class People(object): def __init__(self, name): self.name = name @staticmethod # 把eat方法变为静态方法 def eat(): print("%s is eating" % self.name) d = People("cc") d.eat() #------------------打印输出---------------- #print("%s is eating" % self.name) #NameError: name 'self' is not defined
# 也就证明静态方法无法访问 类中变量
类方法(@classmethod)
类方法是将类本身作为对象进行操作的方法,类方法使用@classmethod装饰器定义,其第一个参数是类,约定为cls。类对象和实例都可以调用类的方法。
类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。
依然还是原来的代码,把eat变为类方法看下:
2)在eat方法中去掉self参数(这也意味着,在eat中不能通过self.调用实例中的其它变量了)