python之路第七天

上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用)。

静态方法(@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.调用实例中的其它变量了)

 
原文地址:https://www.cnblogs.com/houyf/p/5855708.html