首页 > 解决方案 > 如何从 python 的 zip 继承但使用类属性?

问题描述

我遇到了一个有趣的问题...我正在尝试对 python 的zip类型进行子类...我想创建一个充当zip尚未具有类属性的类。

起初我试过

class SomeClass(zip):
    def __init__(self):
        print('I ran')
        self.x = np.array([1,2,3,4])
        self.y = np.array([1,4,9,16])
        super().__init__(self.x,self.y)

但似乎除了zip__init__self

所以我尝试了

class SomeClass(zip):
    def __init__(self):
        self.x = np.array([1, 2, 3, 4])
        self.y = np.array([1, 4, 9, 16])

    def new(self):
        return zip.__new__(SomeClass, self.x, self.y)

哪个有效但需要我做x=SomeClass().new()

终于我到了这个...

class SomeClass(zip):
    def __init__(self):
        print('I ran')
        self.x = np.array([1,2,3,4])
        self.y = np.array([1,4,9,16])
    def __new__(self):
        self.__init__(self)
        return zip.__new__(self, self.x, self.y)
for i in SomeClass():
...     print(i)
...
I ran
I ran
(1, 1)
(2, 4)
(3, 9)
(4, 16)

这运行__init__了两次......我只是好奇是否有办法绕过这个,或者在运行时不会存在类属性__new__

更新:这几乎有效

class SomeClass(zip):
    def __new__(self):
        self.x = np.array([1,2,3,4])
        self.y = np.array([1,4,9,16])
        return super().__new__(self, self.x, self.y)

然而xy不是实例变量:(。示例

class SomeClass(zip):
    def __new__(self, x, y):
        self.x = x
        self.y = y
        return super().__new__(self, self.x, self.y)
>>> k=SomeClass([1,2],[3,4])
>>> k.x
[1, 2]
>>> j=SomeClass([2,2],[4,4])
>>> j.x
[2, 2]
>>> k.x
[2, 2]

为什么是这样?

标签: python

解决方案


您的问题是您正在尝试使用对象属性self.xself.yin __new__self但实际上尚不存在。(你如此不恰当地标记的东西self实际上是班级。)你正在倒退。首先,__new__必须创建一个对象( self),然后才能调用__init__。(不过,你不应该这样做,因为 python 会自动为你做这件事。)

现在,正如您已经发现的那样,您必须有权访问x并且y __init__执行之前(因为您必须将它们传递给zip.__new__)。正因为如此,最容易初始化xy直接在__new__. (__init__then 不再有任何用途,因此可以将其删除。)

class SomeClass(zip):
    def __new__(cls):
        x = [1, 2, 3, 4]
        y = [1, 4, 9, 16]

        obj = super().__new__(cls, x, y)

        obj.x = x
        obj.y = y
        return obj

    def __init__(self):
        print('I ran')

演示:

>>> k = SomeClass()
I ran
>>> k.x
[1, 2, 3, 4]
>>> k.y
[1, 4, 9, 16]
>>> list(k)
[(1, 1), (2, 4), (3, 9), (4, 16)]

推荐阅读