gpt4 book ai didi

python - 使用 Python 覆盖属性

转载 作者:太空狗 更新时间:2023-10-30 00:04:14 27 4
gpt4 key购买 nike

Python中如何覆盖属性的getter?

我试过:

class Vehicule(object):

def _getSpatials(self):
pass

def _setSpatials(self, newSpatials):
pass

spatials = property(_getSpatials, _setSpatials)

class Car(Vehicule)

def _getSpatials(self):
spatials = super(Car, self).spatials()
return spatials

但是 getter 调用的是 Vehicule 的方法而不是 Car 的方法。

我应该改变什么?

最佳答案

看起来您希望 Car 的空间属性的 getter 调用 Vehicule 的空间属性的 setter/getter 。你可以用

class Vehicule(object):
def __init__(self):
self._spatials = 1
def _getSpatials(self):
print("Calling Vehicule's spatials getter")
return self._spatials
def _setSpatials(self,value):
print("Calling Vehicule's spatials setter")
self._spatials=value
spatials=property(_getSpatials,_setSpatials)

class Car(Vehicule):
def __init__(self):
super(Car,self).__init__()
def _getSpatials(self):
print("Calling Car's spatials getter")
return super(Car,self).spatials
spatials=property(_getSpatials)

v=Vehicule()
c=Car()
print(c.spatials)
# Calling Car's spatials getter
# Calling Vehicule's spatials getter
# 1

另一方面,从 Car 的 setter 调用 Vehicule 的 setter 更加困难。显而易见的事情是行不通的:

class Car(Vehicule):
def __init__(self):
super(Car,self).__init__()
def _getSpatials(self):
print("Calling Car's spatials getter")
return super(Car,self).spatials
def _setSpatials(self,value):
print("Calling Car's spatials setter")
super(Car,self).spatials=value
spatials=property(_getSpatials,_setSpatials)

v=Vehicule()
c=Car()
print(c.spatials)
c.spatials = 10
AttributeError: 'super' object has no attribute 'spatials'

相反,技巧是调用 super(Car,self)._setSpatials:

class Car(Vehicule):
def __init__(self):
super(Car,self).__init__()
def _getSpatials(self):
print("Calling Car's spatials getter")
return super(Car,self).spatials
def _setSpatials(self,value):
print("Calling Car's spatials setter")
super(Car,self)._setSpatials(value)
spatials=property(_getSpatials,_setSpatials)

v=Vehicule()
c=Car()
print(c.spatials)
# Calling Car's spatials getter
# Calling Vehicule's spatials getter
# 1
c.spatials = 10
# Calling Car's spatials setter
# Calling Vehicule's spatials setter
print(c.spatials)
# Calling Car's spatials getter
# Calling Vehicule's spatials getter
# 10

关于python - 使用 Python 覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com