1. 报错描述

在这里插入图片描述

2. 报错原因

从报错代码能够看出,我这里涉及了两个类,我用A类和B类来进行描述。

A类:一个方法类,其中报错的 get_element() 就是这个类下的一个方法。在该类我没有实例化
B类:在 get_element() 中调用了A的 get_element() 方法。只在开头 from A import A.

因为A类没有实例化,B类我也没有进行实例化,只是直接引入了这个类。
所以我最后的调用其实是 A类直接调用类方法 get_element() 。所以就报错了。

3. 解决方案

有两种解决方案:

3.1 实例化

在A类中我们实例化,例如 :a = A().
然后在B类引入A类的实例化对象而非A这个类。例:from A import a
如果要调用A类的方法,调用方式如下:a.get_element(传参)

3.2 加上修饰符 @classmethod

该修饰符的作用:

1、@classmethod声明一个类方法,而对于平常我们见到的则叫做实例方法。

2、类方法的第一个参数cls(class的缩写,指这个类本身),而实例方法的第一个参数是self,表示该类的一个实例

3、可以通过类来调用,就像C.f(),相当于java中的静态方法’’’

例:

class A(object):

    # 属性默认为类属性(可以给直接被类本身调用)
    num = "类属性"

    # 实例化方法(必须实例化类之后才能被调用)
    def func1(self): # self : 表示实例化类后的地址id
        print("func1")
        print(self)

    # 类方法(不需要实例化类就可以被类本身调用)
    @classmethod
    def func2(cls):  # cls : 表示没用被实例化的类本身
        print("func2")
        print(cls)
        print(cls.num)
        cls().func1()

    # 不传递传递默认self参数的方法(该方法也是可以直接被类调用的,但是这样做不标准)
    def func3():
        print("func3")
        print(A.num) # 属性是可以直接用类本身调用的
    
# A.func1() 这样调用是会报错:因为func1()调用时需要默认传递实例化类后的地址id参数,如果不实例化类是无法调用的
A.func2()
A.func3()

那么对于我这个例子,直接在A类要被调用的方法 get_element() 前加上修饰符 @classmethod :
在这里插入图片描述
代码就能够成功运行了。

最后总结一下:
如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:软件测试技术群:593462778,群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

作者:暗潮汹涌
原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐