Python - typechecking确定何时不会抛出错误?

use*_*123 7 python oop

我有一些Python类,如果简化,看起来像:

class base:
    def __init__(self, v):
        self.value = v

    def doThings(self):
        print "Doing things."

    def doMoreThings(self):
        print "Doing more things."

    def combine(self, b):
        self.value += b.value

class foo(base):
    def showValue(self):
        print "foo value is %d." % self.value

class bar(base):
    def showValue(self):
        print "bar value is %d." % self.value
Run Code Online (Sandbox Code Playgroud)

base类包含的方法(通过上文表示doThingsdoMoreThings它们实现两者共同的功能性)foobar亚类.在foobar子类中,他们如何解释本质上的区别value领域.(上面,它们只是在打印它们时显示的不同,但在我的实际应用中,它们做了其他一些更复杂的事情.) base可以被认为是"抽象的":用户只能使用foos和bars. base仅存在于其子类共有的代码的主页.

我想问的方法是combine,它允许你取两个这样的对象并制作第三个.因为foobar解释value不同,它对combine两个不同类型的子类没有意义:你可以用combine两个foos来获得一个foo或两个bars来获得a bar而不是a foo和a bar.即便如此,所有子类的过程combine都是相同的,因此将其分解并在一个地方定义是有意义的.

如果用户尝试使用combine两个不兼容的对象,我可能会发出错误信号,但我没有看到一种方法可以在不引入丑陋的类型检查的情况下执行此操作.这样做是好的做法吗?或者我应该做通常的事情而不检查,记录问题,并假设用户不会尝试以combine不打算的方式使用,即使这样的使用看起来"成功"并返回垃圾对象而不是提出错误?

谢谢您的帮助.

glg*_*lgl 3

我在这里看到几种方法:

  1. 不要检查任何东西并相信用户会做正确的事情。可能是适当的,也可能是危险的,具体取决于具体情况。

  2. 检查类型。你是对的,它看起来很丑,但却是最简单的事情。

  3. 没有value,但按照它们应有的方式命名它们 ( pressure, temperature) 并让它们自行组合。

  4. 与 3 相同,但另外子类有一个映射property访问.value它们各自的“真实”值变量的方法。这样,您就可以保留 . __init__(),但是.combine()每个子类都必须完成该操作。

  5. 与4相同,但不使用property,而是使用自制的描述符。在这个答案中,我展示了如何做到这一点。