【问题标题】:Getting AttributeError during instantiation of subclass在子类实例化期间获取 AttributeError
【发布时间】:2017-07-09 19:44:59
【问题描述】:

我正在学习python中的继承, 我有一个名为 Cipher 的超级类,我期待 init 函数中有一个 secret_string 属性,我在子类的 init 中创建了一个继承 Cipher 的新类关键字调用超类的 init,当我创建子类的实例时,我传递了所需的属性,但它给了我一个属性类型错误。

主类:-

 import csv
    import logging

    logging.getLogger().setLevel(logging.INFO)


    class Cipher:
        secret_numbers = []
        orig_dict = {}

        def __init__(self, secret_string, *args, **kwargs):
            # field_names = ["alpha", "posit"]

            self.secret_string = secret_string

            with open("original_assigned.csv", "r") as orig_csv:
                reader = csv.DictReader(orig_csv)
                for row in reader:
                    for k, v in row.items():
                        self.orig_dict[k] = v
                logging.info(self.orig_dict)

            for letter in secret_string:
                self.secret_numbers.append(self.orig_dict.get(letter))

        def get_secret_numbers(self):
            return self.secret_numbers

子类:-

class Keyword(Cipher):
    converted_string = []

    def __init__(self, secret_string, *args, **kwargs):
        if len(self.secret_string) < 1:
            raise ValueError("Secret string cannot be empty")
        super().__init__(secret_string)

    @property
    def convert_to_keyword_string(self):
        for num in self.secret_numbers:
            for k, v in self.orig_dict:
                if num == v:
                    self.converted_string.append(k)
        return self.converted_string

实例创建:-

key = Keyword(["A", "B", "C", "D"])

错误:-

Traceback (most recent call last):
  File "/Users/Documents/workspace/secret_message/cipher.py", line 52, in <module>
    key = Keyword(["A", "B", "C", "D"])
  File "/Users/Documents/workspace/secret_message/cipher.py", line 34, in __init__
    if len(self.secret_string) < 1:
AttributeError: 'Keyword' object has no attribute 'secret_string'

请帮忙。

【问题讨论】:

    标签: python python-3.x inheritance


    【解决方案1】:

    您需要先调用超类的 init,然后才能访问它设置的属性:

    class Keyword(Cipher):
        converted_string = []
    
        def __init__(self, secret_string, *args, **kwargs):
            super().__init__(secret_string)
            if len(self.secret_string) < 1:
                raise ValueError("Secret string cannot be empty")
    

    或者做:

    class Keyword(Cipher):
        converted_string = []
    
        def __init__(self, secret_string, *args, **kwargs):
            if len(secret_string) < 1:
                raise ValueError("Secret string cannot be empty")
            super().__init__(secret_string)
    

    (即删除self.

    【讨论】:

      【解决方案2】:

      您在检查self.secret_string 之后调用父方法__init__。只需在子 __init__ 方法中做第一件事,或者在测试其长度时未定义 self.secret_string

      def __init__(self, secret_string, *args, **kwargs):
          super().__init__(secret_string)
          if len(self.secret_string) < 1:
              raise ValueError("Secret string cannot be empty")
      

      请注意,您可以通过以下方式测试长度:

      if not self.secret_string:
      

      【讨论】:

        猜你喜欢
        • 2013-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-16
        • 2019-06-12
        • 1970-01-01
        相关资源
        最近更新 更多