Python接口自动化测试框架(进阶篇)–类有三大方法(

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。

前言

从上篇《类和对象》学习了如何定义类、使用类,还有关于属性和方法的定义和使用,更有方法重写和继承比较重要的知识点进行讲解,而本篇呢,从中抽取部分内容,单独进行精讲和演示。

image.png

类有三大方法

实例方法(self)、类方法(@classmethod)、静态方法(@staticmethod)

类方法

被@classmethod装饰的方法叫类方法

  • 记得上篇关于类和实例(对象)有一个例子:print(self)输出类对象(实例)的地址,而self.__class__才是类本身;那么print(cls)输出就是类本身,而cls.__class__只是个类型:<class 'type'>
class A:
    
    name = "类属性"
    
    def __init__(self):
        self.age = 10
        
    @classmethod
    def func(cls):
        print(cls)
        print(cls.__class__)
        print("能调用类属性:{},但不能调用实例属性".format(cls.name))
        
复制代码
  • 类方法不能调用实例属性,却能调用类属性、实例方法和静态方法,也能被类和实例调用。

实例方法

定义在类中的方法(第一个参数为self)且只能被实例调用的就叫实例方法;也就是说不能被什么类方法和静态方法调用;可以被类调用

class A:
    
    def func(self):
        self.name = "使用了实例属性的实例方法"
    
    @classmethod
    def func1(cls):
        try:
            cls.func()
        except:
            print("类方法不能调用实例方法")
复制代码
  • tips:当实例方法没有用到实例属性的时候,是可以被类方法调用的。

静态方法

被@staticmethod装饰的叫静态方法,静态方法默认不传参数(当然可以使用参数,但是不能调用类属性和实例属性);能被对象和类调用

  • 试想一下,静态方法里面既不调用属性也不调用方法,能做什么呢?
# 定义静态方法

class A:
    
    @staticmethod
    def func():
        print("它有自己用途,但是却不调用属性和方法")
        print("如要调用属性和方法,可以使用支持类调用的方式")

复制代码
  • 在静态方法中,不会涉及到类中的方法和属性的操作,可以理解为将静态方法寄存在该类的命名空间中。即使要用到类其他属性也是通过类去调用的,它不能去改变属性的值。
class V:
    
    name = "类属性" 
    
    def func(self):
        self.name = "使用了实例属性的实例方法"
    
    @staticmethod
    def func1():
        return V.name

v = V()
print(v.func1())
复制代码

扩展

关于类定义的三个方法及属性相互调用关系,可能比较复杂,使用一个案例来说明,更多注释也写清楚了

class A:
    
    
    age = "类属性==>能被实例方法和类方法调用"
    
    def __init__(self):
        """构造函数"""
        self.name = "实例属性==>能被实例和类调用,不能被类方法调用"
    
    def func1(self):
        """实例方法"""
        print("*"*50)
        print("实例方法==>能调用所有方法和属性")
        self.func2()
        self.func4()
        print(self.name)
        print(self.addr)
        print(self.age)
        print("*"*50)
    
    @classmethod
    def func2(cls):
        """类方法"""
        print("*"*50)
        cls.addr = "类变量==>能被实例和类方法调用"
        print("类方法==>能被实例和类调用")
        print("*"*50)
    
    @classmethod
    def func3(cls):
        """类方法"""
        print("*"*50)
        try:
            cls.name
        except:
            print("类方法==>不能调用实例属性")
        
        try:
            A.func1(cls)
        except:
            print("类方法==>只要类方法调用的实例方法使用了实例属性就不能调用它")
            
        cls.func2()
        print(cls.addr)
        cls.func4()
        print("*"*50)
        
    @staticmethod
    def func4():
        """静态方法"""
        print("*"*50)
        print("静态方法==>能通过类的形式调用属性和方法")
        print(A.age)
        A.func2()
        
        try:
            A.func1(1)
        except:
            print("静态方法==>不能通过类的形式调用实例方法")
        print("*"*50)
        
a = A()
a.func1()
a.func3()
复制代码