Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在使用固有属性的相关方法时重写该属性?_Python_Python 3.x_Inheritance_Properties_Overriding - Fatal编程技术网

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()
选择1 使用重复的属性名
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)