当前位置: 首页 > 面试题库 >

不使用setter的Python覆盖getter

邢勇
2023-03-14
问题内容

class human(object):
def init(self, name=’‘):
self.name = name

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value

class superhuman(human):
    @property
    def name(self):
        return 'super ' + name

s = superhuman('john')
print s.name

# Doesn't work :( "AttributeError: can't set attribute"
s.name = 'jack'
print s.name

我希望能够覆盖该属性,但能够使用超级父级的setter,而不必覆盖子类中的setter。

pythonicaly有可能吗?


问题答案:

使用.getter原始属性的装饰器:

class superhuman(human):
    @human.name.getter
    def name(self):
        return 'super ' + self._name

请注意,您必须使用全名才能到达父类上的原始属性描述符。

示范:

>>> class superhuman(human):
...     @human.name.getter
...     def name(self):
...         return 'super ' + self._name
... 
>>> s = superhuman('john')
>>> print s.name
super john
>>> s.name = 'jack'
>>> print s.name
super jack

property描述对象就是 一个
对象,尽管它可以有多个与之相关的方法(吸气,setter和删除器)。现有描述符提供的.getter.setter.deleter装饰器函数将property返回描述符本身的副本,并替换该特定方法。

因此,在human基类中发生的情况是,首先使用装饰器 创建
了描述符@property,然后用@name.setter语法同时具有getter和setter的描述符替换了该描述符。之所以可行,是因为python装饰器用相同的名称替换了原始装饰函数,它基本上会执行name = name.setter(name)。请参见@property装饰器如何工作?有关所有工作原理的详细信息。

在您的子类中,您只需使用该技巧即可创建描述符的新副本,而只需替换getter。



 类似资料:
  • 我在我的项目中使用lombok,并在POJO类上使用和注释生成和。我试图重写属性的setters方法,但它不起作用 我想检查JSON属性是空的还是空的,我想在Setter方法中设置默认值 工作场景: 失败的场景: 输出: 我也将此作为参考,但到目前为止运气不佳

  • 问题内容: 我使用的龙目岛在我的项目和产生和使用,并注解POJO类的顶部。我正在尝试覆盖属性的setter方法,但是它不起作用 我想检查JSON属性是否为空或空,我想在Setter方法中设置默认值 工作方案: 失败的情况: 输出: 问题答案: 您只是遇到了一个我从未见过的错误,或者您正在测试错误。 像这样的注释 在现场一级确实阻止了设置器的生成。但是考虑到要定义一个setter,您甚至不需要它。显

  • 我试图将我的项目升级到一些最新版本,但由于项目中的一些依赖项尚未更新,我无法获得空安全性。 我已经求助于sdk版本2.10,同时我更新了所有核心包,解决了所有突破性的更改。一些不推荐的更改(如FlatButton到TextButton,尚未解决)。 我在构建解决方案时遇到了几个问题,在咨询了一些旧的Stack帖子后,我拼凑了gradle文件更新,升级到Android Studio等... 但是,当

  • 问题内容: 因此,我有一个自定义类,该类具有与int一起使用的功能。然而,在我的程序(库),它越来越被称为周围的其他方法,即,在那里是我的班。有什么办法可以让它使用我的功能吗? 问题答案: 只需将以下内容添加到类定义中,就可以了:

  • 问题内容: 我知道python函数默认是虚拟的。假设我有这个: 我不希望他们能够这样做: 有没有办法防止用户重载roo()? 问题答案: 您可以使用元类: 每当创建子类时,就会调用该元类型的 new 。如果您在场,这将导致错误。仅当没有基类时,它才会接受roo的定义。 您可以通过使用注释来声明哪些方法是最终方法,从而使该方法更加理想。然后,您需要检查所有基准并计算所有最终方法,以查看是否有任何基准

  • 我试图满足几个使用FFMPEG构建视频文件的分层场景。 场景1:将一个视频(指定视频的不透明度)覆盖在一个图像的顶部,作为结果创建一个新的视频。 我用以下方法解决了这个问题: 我正在将视频缩放到3840x2160以匹配我的图像(理想的情况下,我会让它们事先匹配)。 场景2:现在有3层,视频-图像-图像。中间的图像层是带有文字的透明图像。所以我们有一个基础图像,上面覆盖了文本,在一定的不透明度下有一