

初歩的なミスなのかもしれませんが、どなたか教えてください・・・

以下のコード↓

[code]

    class Set:
        def __init__(self, value = []):
            self.data = []
            self.concat(value)
    
        def intersect(self, other):
            res = []
            for x in self.data:
                if x in other:
                    res.append(x)
            return Set(res)
    
    def union(self, other):
        res = self.data[:]
        for x in other:
            if not x in res:
                res.append(x)
        return Set(res)
    
    def concat(self, value):
        for x in value:
            if not x in self.data:
                self.data.append(x)
    
    def __len__(self):          return len(self.data)
    def __getitem__(self, key): return self.data[key]
    def __and__(self, other):   return self.intersect(other)
    def __or__(self, other):    return self.union(other)
    def __repr__(self):         return 'Set:' + `self.data`
    
[/code]

を書いたうえで、次に↓

[code]

    >>> x = Set([1,2,3,4])
    
[/code]

と実行しますと↓

Traceback (most recent call last):  
File "", line 1, in  
x = Set([1,2,3,4])  
File "", line 4, in **init**  
self.concat(value)  
AttributeError: Set instance has no attribute 'concat'  
と表示されます。  
concatを属性として持っていないというエラーだと思うのですが、この場合の対処法または、コードの不備等があれば教えて頂きたいです。  
宜しくお願い致します。


CC BY-SA 3.0
2016-01-20T07:59:37.613
21115
2019-10-17T05:10:24.647
2016-01-20T08:29:09.433
13860
13860
question
python
__init__が呼び出されずAttributeErrorと表示される。


concatはクラスの外に存在しますので動かないです。selfが必要ないです。

[code]

    concat(self, value)
    
[/code]


CC BY-SA 3.0
2016-01-20T08:42:16.260
21119
2016-01-20T08:51:32.440
2016-01-20T08:51:32.440
7325
7325
21115
answer


pythonはインデントによってブロックを認識します。

そのため、`def concat`等がSetのメソッドだと仮定すると、`class Set:`よりも1つ階層が下のインデントで書かなければ動作しません。

ついでに、`if x not in res`が正しい記法です。

[code]

    class Set:
        def __init__(self, value=[]):
            self.data = []
            self.concat(value)
    
        def intersect(self, other):
            res = []
            for x in self.data:
                if x in other:
                    res.append(x)
            return Set(res)
    
        def union(self, other):
            res = self.data[:]
            for x in other:
                if x not in res:
                    res.append(x)
            return Set(res)
    
        def concat(self, value):
            for x in value:
                if x not in self.data:
                    self.data.append(x)
    
        def __len__(self):
            return len(self.data)
    
        def __getitem__(self, key):
            return self.data[key]
    
        def __and__(self, other):
            return self.intersect(other)
    
        def __or__(self, other):
            return self.union(other)
    
        def __repr__(self):
            return 'Set:' + str(self.data)
    
    
    if __name__ == "__main__":
        x = Set([1, 2, 3, 4])
        print(x)
    
[/code]


CC BY-SA 4.0
2019-10-17T01:14:15.090
59754
2019-10-17T05:10:24.647
2019-10-17T05:10:24.647
21115
answer