Python 如何在使用固有属性的相关方法时重写该属性?
上面的代码将具有无限递归Python 如何在使用固有属性的相关方法时重写该属性?,python,python-3.x,inheritance,properties,overriding,Python,Python 3.x,Inheritance,Properties,Overriding,上面的代码将具有无限递归 理想的结果是,当我调用b.nums时,它会打印[4,5]。我怎样才能得到想要的结果?谢谢。您正在生成一个递归,因为重复的nums。您有两种解决方法: 用另一个名称重命名bar类中的nums 不要使用super(),而是指定类名foo() 选择1 使用重复的属性名nums生成递归,因为您调用: print(b.nums)-->return super().gt(3)-->返回[self.nums中num的num如果num>x]-->return super().gt(
理想的结果是,当我调用
b.nums
时,它会打印[4,5]
。我怎样才能得到想要的结果?谢谢。您正在生成一个递归,因为重复的nums
。您有两种解决方法:
- 用另一个名称重命名
类中的bar
nums
- 不要使用
,而是指定类名super()
foo()
nums
生成递归,因为您调用:
print(b.nums)
-->return super().gt(3)
-->返回[self.nums中num的num如果num>x]
-->return super().gt(3)
-->
在for循环中,您可以调用self.nums,这是再次调用for的条().nums
,它一次又一次地调用nums
选择2
这将生成类的新实例
foo
默认情况下,您的实现是非逻辑的。
类bar
中的函数nums
覆盖类foo
中的函数nums
——因此,当您在gt
函数的列表理解中调用self.nums
时,实际调用的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 nums(self):
return foo().gt(3)
f = foo()
b = bar()
print(f.nums)
print(b.nums)
另一个选项是使nums
成为成员并从nums
返回它,如下所示:
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)
用
foo()
更改super()
,或者用另一个名称重命名bar
中的nums
,否则它将创建一个递归。您只需要有一个逻辑递归即可。当值从gt
获取时,如何从nums
返回值,后者从nums
计算值,后者从gt
获取值……?@Carlo Zanocco非常好,介意解释更多吗?但是它正在栏中创建另一个foo()
。。?无论如何,要避免这一点吗?@克里斯兰看一下我的选择,我不认为第2个选项是明智的。如果类需要参数进行实例化,那么你就完蛋了。
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 foo().gt(3)
f = foo()
b = bar()
print(f.nums)
print(b.nums)
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)
class foo:
nums_member = [1, 2, 3, 4, 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)