代码之家  ›  专栏  ›  技术社区  ›  UncleZeiv

如果基类的数据成员被重写为派生类中的属性,如何调用它?

  •  5
  • UncleZeiv  · 技术社区  · 17 年前

    这个问题类似于 this other one

    换句话说,如果我用派生类中的属性重写基类的名称,我如何访问基类的成员?

    class Base(object):
        def __init__(self):
            self.foo = 5
    
    class Derived(Base):
        def __init__(self):
            Base.__init__(self)
    
        @property
        def foo(self):
            return 1 + self.foo # doesn't work of course!
    
        @foo.setter
        def foo(self, f):
            self._foo = f
    
    bar = Base()
    print bar.foo
    
    foobar = Derived()
    print foobar.foo
    

    总而言之,描述符协议似乎与继承没有很好的交互。..

    5 回复  |  直到 9 年前
        1
  •  9
  •   S.Lott    17 年前

    Base .

    class LooksLikeDerived( object ):
        def __init__( self ):
            self.base= Base()
    
        @property
        def foo(self):
            return 1 + self.base.foo # always works
    
        @foo.setter
        def foo(self, f):
            self.base.foo = f
    

    但是基地的其他方法呢?您在中复制了这些名称 LooksLikeDerived

    def someMethodOfBase( self, *args, **kw ):
        return self.base.someMethodOfBase( *args **kw )
    

    是的,它感觉不到“干燥”。然而,当你试图用新功能“包装”一些类时,它可以防止很多问题。

        2
  •  4
  •   balpha    17 年前

    定义

    def __init__(self):
        self.foo = 5
    

    Base 使 foo 的成员(属性) 例子 ,不是班上的。这 基础 不知道 foo ,因此无法通过类似的方式访问它 super()

    foobar = Derived()
    

    __init__() 基类调用的方法

    self.foo = 5
    

    这不会导致属性的创建/覆盖,而是 Derived

    self.foo.fset(5)
    

    因此 self._foo = 5

    return 1 + self._foo
    

    在你的getter中,你几乎得到了你想要的东西。如果你需要这个值 self.foo 设置为in 基础 _foo ,由正确设置 @foo.setter .

        3
  •  1
  •   mtasic85 Ed Heal    17 年前
    class Foo(object):
        def __new__(cls, *args, **kw):
            return object.__new__(cls, *args, **kw)
    
        def __init__(self):
            self.foo = 5
    
    class Bar(Foo):
        def __new__(cls, *args, **kw):
            self = object.__new__(cls, *args, **kw)
            self.__foo = Foo.__new__(Foo)
            return self
    
        def __init__(self):
            Foo.__init__(self)
    
        @property
        def foo(self):
            return 1 + self.__foo.foo
    
        @foo.setter
        def foo(self, foo):
            self.__foo.foo = foo
    
    bar = Bar()
    bar.foo = 10
    print bar.foo
    
        4
  •  0
  •   Anurag Uniyal    17 年前

    一旦你有了同名的“foo”属性,它就会覆盖名为“foo”的访问行为 字典

    顺便说一句:我使用python 2.5,因此不得不稍微更改代码

    class Base(object):
        def __init__(self):
            self.foo = 5
    
    class Derived(Base):
        def __init__(self):
            Base.__init__(self)
    
        def g_foo(self):
            return 1 + self.__dict__['foo'] # works now!
    
        def s_foo(self, f):
            self.__dict__['foo'] = f
            self._foo = f
    
        foo = property(g_foo, s_foo)
    
    bar = Base()
    print bar.foo
    
    foobar = Derived()
    print foobar.foo
    
        5
  •  0
  •   ironfroggy    17 年前

    初始化

    定义 初始化 self.foo=5

    class Derived(Base):
      def __init__(self):
        Base.__init__(self)
    
      @property
      def foo(self):
        return 1 + self._foo # DOES work of course!
    
      @foo.setter
      def foo(self, f):
        self._foo = f
    
    bar = Base()
    print bar.foo
    
    foobar = Derived()
    print foobar.foo
    
    推荐文章