1

我想遵循良好的编程习惯,所以我有点卡在这个问题上:

假设我有类根,

Class root(Object):
   def __init__(self):
     self._root_tree = 'Base'

   def __str__(self):
     return self._root_tree

   def _test(self):
      return 'test'

假设我创建了一个名为 Oak 的类

Class Oak(root):
    def __str__(self):
      return 'Oak'
    def _test(self):
      return 'Oak_test'
    def _new_fun(self):
      return 'new_func_only_in_oak'

然后在 Class Cherry 中,我可以执行以下操作吗

Class Cherry(root):
    def _grab_trees(self,another_tree): #another_tree is a Oak object
      other_tree = another_tree.__str__() #this will return Oak
      return 'The other three is: ' + other_tree
    def _test2(self,another_tree):
      return another_tree._test()
    def _testing_new(self,another_tree):
      return another_tree._new_fun()

基本上调用__str__() _new_fun()_test()在 Cherry 类中有效(良好做法)。

4

2 回答 2

0

你可以,但在这个例子中,最好只调用str(another_tree). 一般来说,您不应该直接调用双下划线方法,除非您正在做一些与它们的实现特别相关的事情(例如,从子类实现中调用超类实现)。大多数情况下,双下划线方法的存在是为了让类在更“正常”的上下文中以某种方式表现,并且您应该将该正常上下文用于正常目的。例如,__str__当你调用它时,存在让类做正确的事情str(),所以你应该调用str()它而不是__str__直接调用。

至于单下划线方法,除非您编写它们,否则调用它们通常不是一个好主意。这样做没有“惩罚”,但按照惯例,单个下划线表示不属于公共 API 的方法。因此,如果您使用它们,如果您正在使用的库已更新并且这些下划线方法消失或更改,您将面临代码中断的风险。

于 2012-08-02T02:22:02.930 回答
0

这取决于您的设计声明为这些类方法的逻辑接口的内容。

如果您以某种方式在某处指定您正在返回非实例,那么您所做的一切都很好。如果您正在创建隐含的期望,即方法返回 Cherry 的实例并且您正在返回 Oak,那么您正在为严重的错误引入空间。

一般来说,__method__为类的内部工作和重铸保留约定。

于 2012-08-02T02:23:36.613 回答