如何解决使用相关方法时如何覆盖固有属性?
class foo:
@property
def nums(self):
return [1,2,3,4,5]
def gt(self,x):
return [num for num in self.nums if num > x]
class bar(foo):
@property
def nums(self):
return super().gt(3)
f = foo()
b = bar()
print(f.nums)
print(b.nums)
上面的代码将具有无限递归。
理想的结果是,当我致电[4,5]
时,它会打印b.nums
。我怎么会有理想的结果?谢谢。
解决方法
默认情况下,您的实现是非逻辑的。
类nums
中的函数bar
覆盖类nums
中的函数foo
-因此,当您以self.nums
的列表理解方式调用gt
时函数-实际调用的nums
是bar
中被覆盖的那个。
不确定您的约束是什么,但不能覆盖即可完成工作:
class foo:
@property
def nums(self):
return [1,2,3,4,5]
def gt(self,x):
return [num for num in self.nums if num > x]
class bar(foo):
@property
def nums2(self):
return super().gt(3)
f = foo()
b = bar()
print(f.nums)
print(b.nums2)
另一种选择是使nums
成为成员并从nums
返回,例如:
class foo:
nums_member = [1,5]
@property
def nums(self):
return self.nums_member
def gt(self,x):
return [num for num in self.nums_member if num > x]
class bar(foo):
@property
def nums(self):
return super().gt(3)
f = foo()
b = bar()
print(f.nums)
print(b.nums)
,
您正在生成递归,因为重复的nums
。您有两种解决方法:
- 在
nums
类内的bar
重命名 - 不要使用
super()
,而是指定类名foo()
选项1
class foo:
@property
def nums(self):
return [1,5]
def gt(self,x):
return [num for num in self.nums if num > x]
class bar(foo):
@property
def diffrent_nums(self):
return super().gt(3)
f = foo()
b = bar()
print(f.nums)
print(b.diffrent_nums)
具有重复的属性名称nums
会生成递归,因为您调用:
print(b.nums)
-> return super().gt(3)
-> return [num for num in self.nums if num > x]
-> return super().gt(3)
-> ....
在for循环中,您调用self.nums
,即bar().nums
再次调用for,一次又一次调用nums
选项2
class foo:
@property
def nums(self):
return [1,x):
return [num for num in self.nums if num > x]
class bar(foo):
@property
def nums(self):
return foo().gt(3)
f = foo()
b = bar()
print(f.nums)
print(b.nums)
这将生成类foo
的新实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。