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

python中的重写属性

强硕
2023-03-14
问题内容

因此,我试图找出最好的方法(以最少的代码量实现最优雅的方法)以允许重写python中某个属性的特定功能(例如,仅使用getter,仅使用setter等)。我喜欢下面的属性处理方式,因为它们的所有方法都封装在同一缩进的代码块中(更容易看到处理一个属性的函数在哪里停止,而处理一个属性的函数在哪里停止比较容易下一个开始):

@apply
def foo():
    """A foobar"""
    def fget(self):
        return self._foo
    def fset(self, val):
        self._foo = val
    return property(**locals())

但是,如果我想从以这种方式定义属性的类中继承,然后重写foosetter函数,这似乎很棘手。我做了一些搜索和大多数我已经找到了答案已经在基类来定义不同的功能(例如getFoosetFoo),明确创建它们(如属性定义foo = property(lambda x: x.getFoo(), lambda x, y: x.setFoo(y), lambda x: x.delFoo())),然后覆盖getFoosetFoo以及delFoo根据需要。

我不喜欢这种解决方案,因为它意味着我必须为每个属性定义lambas,然后写出每个函数调用(在完成之前property(**locals()))。我也没有得到我原来的封装。

理想情况下,我希望能够执行以下操作:

class A(object):
    def __init__(self):
        self.foo = 8
    @apply
    def foo():
        """A foobar"""
        def fget(self):
            return self._foo
        def fset(self, val):
            self._foo = val
        return property(**locals())

class ATimesTwo(A):
    @some_decorator
    def foo():
        def fset(self, val):
            self._foo = val * 2
        return something

然后输出将类似于:

>>> a = A()
>>> a.foo
8
>>> b = ATimesTwo()
>>> b.foo
16

基本上,ATimesTwo继承自getter函数,A但覆盖setter函数。是否有人知道执行此操作的方式(类似于上面的示例)?some_decorator看起来像什么函数,该foo函数应该返回什么?


问题答案:

我敢肯定,您以前听说过,但自Python 2.3apply起已弃用 八年了
。不要使用它。您对的使用locals()也与Python的Zen背道而驰-显式优于隐式。如果您真的喜欢增加缩进量,则无需创建一次性对象,只需执行

if True:
    @property
    def foo(self):
        return self._foo
    @foo.setter
    def foo(self, val):
        self._foo = val

不会滥用locals,使用apply,需要创建一个额外的对象,或者之后需要添加一行以foo = foo()使其更难于看到该块的结尾。它对于您的老式使用方式同样有效property-就foo = property(fget, fset)像平常一样。

如果要覆盖任意子类中的属性,则可以使用类似以下的配方。

如果子类知道属性的定义位置,请执行以下操作:

class ATimesTwo(A):
    @A.foo.setter
    def foo(self, val):
        self._foo = val * 2


 类似资料:
  • 问题内容: 鉴于Python文档为: 您可以在子类中重写此方法。标准的run()方法调用传递到对象构造函数的可调用对象作为目标参数(如果有),并分别从args和kwargs参数中获取顺序和关键字参数。 我构造了以下代码: 但是当我执行它时,出现以下错误: 似乎我缺少明显的东西,但是我看到的各种示例都可以使用此方法。最终,我尝试将字符串和字典传递给线程,如果构造方法不是正确的方法,而是在启动线程之前

  • 我知道我可以使用。但是注释只接受文字。如果我想计算值,或者即使我想计算要重写的属性,该怎么办。Spring可行吗?如何在Spring的中注册任意属性?

  • 更新:我发布了两个更简洁的代码片段,说明了混乱的根源: https://gist.github.com/mttkay/9fbb0ddf72f471465afc https://gist.github.com/mttkay/5dc9bde1006b70e1e8ba

  • 我是CSS网格主题的新手,我在网格的帮助下为一个网站创建了一个标题,我创建了带有徽标的标题、导航栏、搜索栏、带有网格的按钮 现在,最后两个属性对齐项目和对齐项目适用于所有ie,用于徽标、导航栏、搜索栏和按钮。我的问题是:我想覆盖这个justify items:center属性,以便仅对navBar的items:flex start进行对齐。那么谁能帮我? 以下是标题的屏幕截图:

  • 问题内容: 找不到更好的标题标题的方法,请随时进行纠正。 我是Python的新手,目前正在尝试使用该语言。.我注意到,所有内置类型都不能用其他成员扩展。.例如,我想向该类型添加一个方法,但这会不可能。我意识到出于效率方面的考虑而设计这种方式,并且大多数内置类型都是用C实现的。 好吧,为什么我发现要覆盖此行为的一个原因是定义了一个新类,该类可以扩展但不执行任何操作。然后,我可以将变量分配给该新类,并

  • 对象getBean() 返回包含此属性的对象。如果对象中不包含此属性,则返回null。 我注意到,在许多节点中,大多数(如果不是全部)属性都被定义为覆盖方法。当然,考虑到Javadoc中对的描述,这样做非常有意义。 或者一种更常见的方法,将无效侦听器添加到中: Javadoc的编写方式表明这是正确的方法;如果你偏离了这种做法,你可能做得不对,你可能得不到想要的结果。 所以,这些是我的问题: 我们需