python - 如何从 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)
然而x
,y
不是实例变量:(。示例
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]
为什么是这样?
解决方案
您的问题是您正在尝试使用对象属性self.x
和self.y
in __new__
,self
但实际上尚不存在。(你如此不恰当地标记的东西self
实际上是班级。)你正在倒退。首先,__new__
必须创建一个对象( self
),然后才能调用__init__
。(不过,你不应该这样做,因为 python 会自动为你做这件事。)
现在,正如您已经发现的那样,您必须有权访问x
并且y
在 __init__
执行之前(因为您必须将它们传递给zip.__new__
)。正因为如此,最容易初始化x
并y
直接在__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)]