Python 更改超类的类型

Python 更改超类的类型,python,inheritance,Python,Inheritance,我不明白,若我得到另一个类型dict的子类,那个么主类中的构造函数是如何将类型从list改为dict的 这是什么魔法 class Adder: def __init__(self, data = [ ]): self.data = data def __add__(self, other): return "Not Implemented" class DictAdder(Adder): def __add__(self, y): z = {}

我不明白,若我得到另一个类型dict的子类,那个么主类中的构造函数是如何将类型从list改为dict的

这是什么魔法

class Adder:
def __init__(self, data = [ ]):
    self.data = data
def __add__(self, other):
    return "Not Implemented"



class DictAdder(Adder):
    def __add__(self, y):
        z = {}
        for k in self.data.keys(): z[k] = self.data[k]
        for k in y.keys(): z[k] = y[k]
        return z




y = DictAdder({1:'a', 2:'b'})
l = y + { 3: 'c', 4: 'd'}
print(l)
答复:

 {1: 'a', 2: 'b', 3: 'c', 4: 'd'}
Pycharm show what self.data.keys()没有属性keys(),这必须尝试,因为数据是一个列表,但这是工作,数据默认为一个列表,但Python不是静态类型语言,所以它不必是<代码>数据只是一个名称。就因为我们有这个,

class Adder:
    def __init__(self, data = [ ]):
        self.data = data
不会限制我们的使用。我仍然可以做到:

i = Adder(4)
s = Adder('hello')
d = Adder({1: 2})
o = Adder(SomeOtherType())

只要使用Adder.data的任何东西都正确地将其用于它所属的类型。因为在这种情况下,
DictAdder
数据
解释为
dict
,这样就可以了。当然,如果您试图使用由非
dict
构造的
DictAdder
,您将得到一个错误

是的,如果获取列表或其他类型到DICTADER,我有错误。但是,正如我所写,这是一个很好的解决方案?或者还有其他解决方案吗?在Python中变量没有类型。变量可用于指向任何类型的对象:
x=1;x=[];x='foo'
。另外,否则您可能会在一段时间内发布另一个问题。:-)