首页 python基础教程 Python面向对象-实例方法,类方法和静态方法
pay pay

Python面向对象-实例方法,类方法和静态方法

日期: 2021年12月2日 15:37
栏目: python基础教程
阅读: 110
作者: python自学网

摘要: 在类中,前面介绍的属性主要描述对象的一些基本信息,而这篇文章所介绍的方法是用来表示对象应该具有的功能,或者可以理解为对象拥有这些方法之后就能处理一些事情。类方法主要分为实例方法,类方法和静态方法三大类。

在类中,前面介绍的属性主要描述对象的一些基本信息,而这篇文章所介绍的方法是用来表示对象应该具有的功能,或者可以理解为对象拥有这些方法之后就能处理一些事情。类方法主要分为实例方法,类方法和静态方法三大类。

我们先从类方法的构造来逐步学习类方法的使用。

# 方法是用来描述一个目标的行为动作
def run():
    print('快点跑')
run()

class Per:
    def run(self):
        print('快点跑')

p = Per()
p.run()
Per.run(p)  # 方法是用来描述一个目标的行为动作,所以必须给方法中的self一个具体的实例化目标,也就是对象
Per.run(Per)  # TypeError: run() missing 1 required positional argument: 'self'  也可以用类本身

我们可以通过对象和类名来调用类方法,使用类名调用的时候需要给类方法传入一个实例,不能直接传入类本身,虽然累本身也是实例。这种方法就是我们下面要讲的实例方法。

  1. 实例方法(一般指实例的对象方法):第一个参数self默认接受实例对象本身;
  2. 类方法:第一个参数self默认接受一个类,使用类方法装饰器@classmethod来修饰;
  3. 静态方法:没有默认接受参数,使用静态方法装饰器@staticmethod来修饰。
class Dog:
    def run(self):  # 1.实例方法
        print('实例方法', self)  # 实例方法 <__main__.Dog object at 0x0000000002333B20>

    @classmethod  # 2.类方法
    def shout(cls):
        print('类方法', cls)  # 类方法 <class '__main__.Dog'>

    @staticmethod  # 3.静态方法
    def eat():
        print('静态方法')

注意三种类方法的调用

d = Dog()
d.run()  # 需要传入一个实例对象,这里把d直接传了进去
print(d)  # <__main__.Dog object at 0x0000000002303B20>
Dog.run(d)  # 这里不能直接使用类来调用类中的实例方法,需要传递一个实例对象d才可以使用

d.shout()  # 通过向上溯源实例所属类找到Dog类之后传入参数,最正确的是按照下面的方法使用
Dog.shout()  # 类方法 <class '__main__.Dog'>

d.eat()

返回结果:

实例方法 <__main__.Dog object at 0x0000000001E7BF70>
<__main__.Dog object at 0x0000000001E7BF70>
实例方法 <__main__.Dog object at 0x0000000001E7BF70>
类方法 <class '__main__.Dog'>
类方法 <class '__main__.Dog'>
静态方法

 类方法和对象方法的存储问题,和属性一样,方法也是存储在__dict__这个字典内。

print(Dog.__dict__)
print(d.__dict__)

返回结果:

{'__module__': '__main__', 'run': <function Dog.run at 0x0000000002342280>, 'shout': <classmethod object at 0x0000000001D9A460>, 'eat': <staticmethod object at 0x0000000001E14D30>, '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}
{}

注意字典里面存入的方法,其实是一个对象,字典中是可以存入对象的,注意不同方法的语法,调用方法和传参规则。 

目录
回顶部