有关python和类的问题

| 我有一个基类,还有一些派生自Python的类:
class Base:
   def Foo(self):
      pass

# First derived class
class Der1(Base):
   def OwnFoo(self):
      # Do something 1
   def OwnFoo2(self):
      # Do something 2

   def Foo(self):
      # Do something 3

# Second derived class
class Der2(Base):
   def OwnFoo(self):
      # Do something 1
   def OwnFoo2(self):
      # Do something 2

   def Foo(self):
      # Do something 3
问题是: 我在
Der1
中有一些预定义的代码。
Der2
中的几乎所有功能都执行相同的操作。如何用更少的代码来编写? 我无法将该代码添加到父项中。家长班不应受到影响。 例如,
Der2.OwnFoo
Der1.OwnFoo
相同,也许python中有一些构造只是为了从第一类调用
OwnFoo
而不再再次编写该代码? 我不能改变
Der1
Der2
的父母!应该是
Base
已邀请:
由于您无法更改继承结构,因此请创建一个包含通用代码的帮助程序类,并按组成而不是继承的方式将其包括在内。
# Common code goes in this new class
class DerHelper:
    def __init__(self, parent):
        self._parent = parent
    def OwnFoo(self):
        print \'Do something 1\', self._parent
    def OwnFoo2(self):
        print \'Do something 2\', self._parent
    def Foo(self):
        print \'Do something 3\', self._parent

# First derived class
class Der1(Base):
    def __init__(self):
        # include helper class by composition
        self._helper = DerHelper(\'Der1\')
    def OwnFoo(self):
        self._helper.OwnFoo()
    def OwnFoo2(self):
        self._helper.OwnFoo2()
    def Foo(self):
        self._helper.Foo()

# Second derived class
class Der2(Base):
    def __init__(self):
        # include helper class by composition
        self._helper = DerHelper(\'Der2\')
    def OwnFoo(self):
        self._helper.OwnFoo()
    def OwnFoo2(self):
        self._helper.OwnFoo2()
    def Foo(self):
        self._helper.Foo()
当然,您可以将引用传递给父级,而不是字符串。我只是以这种方式进行演示的目的。 用法:
d = Der1()
d.OwnFoo()
d.OwnFoo2()
d.Foo()

d = Der2()
d.OwnFoo()
d.OwnFoo2()
d.Foo()
输出:
Do something 1 Der1
Do something 2 Der1
Do something 3 Der1
Do something 1 Der2
Do something 2 Der2
Do something 3 Der2
Der2
作为
Der1
的子类,您已完成。
class Base:
   def Foo(self):
      pass

# First derived class
class Der1(Base):
   def OwnFoo(self):
      # Do something 1
   def OwnFoo2(self):
      # Do something 2

   def Foo(self):
      # Do something 3

# Second derived class (subclasses Der1)
class Der2(Der1):
   pass
您想要在ѭ2added之内进行的任何行为都可以添加到类定义中。如果您在
Der2
中创建一个同名的新方法(例如
Der2.OwnFoo()
),则它将重载从
Der1
继承的默认方法。 编辑:如果您不能更改父级,请将要继承的所有行为放在基类中,请记住您可以重载或自定义子类中的任何方法。 在代码中:
# Base class
class Base:
    def Foo1(self):
        # Do something 1
    def Foo2(self):
        # Do something 2
    def Foo(self):
        # Do something 3

# First derived class, inherits everything from Base
class Der1(Base):
    pass

# Second derived class
class Der2(Base):
    pass  
您可以执行一个“技巧”来调用从父代继承的原始方法,捕获返回值,然后自定义行为。仅当该方法实际返回一个值时,这才起作用;如果该方法在该类中操作属性,则可能很危险,除非您想要并期望它。 在代码中:
# Second derived class, with customized methods
class Der2(Base):
    # Anything that is not explicitly define is inherited from parent
    # as-is.

    def Foo(self):
        # My Foo() overloads Base.Foo() inherited from parent class. 
        # Do something \"special\" 3

    def Foo1(self):
        # Calls parent Base.Foo1() and then manipulates return data.
        base_output = Base.Foo1(self)
        # Do something \"special\" 1 with \'base_output\'
这是家庭作业吗? 看of2ѭ的第一行:
class Der2(Base):
它的父级是什么意思(例如,它所属的类及其继承的方法和属性)?你怎么能改变这个?
如果
Der1
Der2
共享许多代码,则应将其放在超类中;否则,请使用以下代码:由于无法触碰
Base
,请在两者之间引入一个类:
class Der(Base):
    def OwnFoo(self):
        ...

class Der1(Der):
    ...

class Der2(Der):
    ...
(根据您的班级等级,其他人推荐的“从
Der1
2ѭ\”选项也可能有效。)
Der2
子类
Der1
变成怎么样?

要回复问题请先登录注册