Python AttributeError:对象在Unittest中没有属性

时间:2018-10-15 11:21:28

标签: python class methods python-unittest

我有2个脚本,第1个是All_Methods,另一个是All_Testcases,因为我正在使用unittest框架,所以我们开始吧。

All_Methods就像:

class All_Services():
        def abc(self):
            x =1

        def bca(self):
            print "My Name is Taimoor"
            self.abc()

        def cba(self):
            self.bca()

在另一个脚本All_TestCases上是这样的:

from All_Methods import All_Services as service

    class All_TestCases(unittest.TestCase):
              def test_1_running_method(self)
                      service.cba(self)

异常显示为:

AttributeError: 'All_TestCases' object has no attribute 'bca'

请有人告诉我,我在这里想念的是什么? 谢谢。

3 个答案:

答案 0 :(得分:1)

该示例中的代码有很多错误,但请放一旁。

该错误是由于将class A的实例作为self参数传递给class B的(非静态)方法引起的。 Python将尝试在class A的实例上调用此方法,从而导致缺少属性错误。

这是问题的简化示例:

class A:
    def is_ham(self):
        # Python secretly does `self.is_ham()` here, 
        # because `self` is the current instance of Class A. 
        # Unless you explicitly pass `self` when calling the method.
        return True


class B:
    def is_it_ham(self):
        # Note, `self` is an instance of class B here.
        return A.is_ham(self)


spam = B()
spam.is_it_ham()

答案 1 :(得分:0)

当您将自身传递给在类上调用的方法时,您不会以通常的方式使用类。常见的做法是在类的实例上调用方法并隐式获取self参数。

调用batch时,self是Method.running_query_Athena(self)的实例,没有方法All_TestCases

您是说connecting_Athena源自All_TestCases吗?

为什么All_Methods完全是一堂课?

答案 2 :(得分:0)

  1. 使用适当的缩进,因为python完全基于代码的缩进方式。
  2. 请,请使用正确的命名约定;根据{{​​3}}的建议。
  3. 您正在尝试在没有实例的情况下访问实例方法。

尝试以下操作:

class MyClass:
    def my_instance_method(self):
        return True

    @classmethod
    def my_class_method(cls):
        return True

    @staticmethod
    def my_static_method():
        return True

这行不通:

>> MyClass.my_instance_method()
TypeError: my_instance_method() missing 1 required positional argument: 'self'

但是这些将被绑定,因为它们没有绑定到正在创建的类实例上。

MyClass.my_class_method()
MyClass.my_static_method()

实例方法要求您实例化Class;您使用的含义:

MyClass().my_instance_method()

由于您似乎想在类实例上设置response_id;使用表示类实例的self参数来获取response_id。 -我建议您使用实例方法并实例化该类,如上所示(注意,类名后的()

请务必解决您的格式问题。