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

在python中创建嵌套类是一种好习惯吗?

姚高爽
2023-03-14
问题内容

我设法定义一个类A,使用另一个类B的实例列表作为类A的实例变量。B类具有更改A类的另一个实例变量a1的功能。类A还具有更改类B的实例变量bb的功能。因此,A类可以访问B类,而B类可以访问A类。这两个类嵌套在一起。我知道我们可以简化将B类的所有实例变量和函数更改为A类的事情。但是在我的项目中,这种嵌套结构才是真正的东西。

class A:
  class B:
      count = 0
      def __init__(self,b1=None,b2=None):
          self.b1 = b1
          self.b2 = b2
      def funcb(self,bb):
          A.a1 = pyfunc1(bb)
  def __init__(self,a1,a2):
      self.a1 = a1
      self.a2 = a2
      self.listb = [A.B()]
  def funca(self,aa):
      A.B.count += 1
      b = A.B(self.a1,self.a2)
      listb.append(b)
      listb[A.B.count].b1 = listb[A.B.count-1].b1.pyfunc2(aa)
      listb[A.B.count].b2 = pyfunc3(aa,self.a2)
      listb[A.B.count].funcb(self.a2)

我想知道的是,这种嵌套类是否会降低python的效率?有更好的解决方案吗?


问题答案:

嵌套类不会降低也不提高执行效率。它可能会改变维护和理解效率。

嵌套类成为父类的 另一个属性
。您必须引用A.B而不是B。就是这样,您将查找推迟到另一个名称空间。换句话说,您的__init__方法将失败,因为没有全局名称B,只有A.B并且self.B存在(都引用相同的类对象)。

否则,嵌套类与其父类之间就没有特殊的关系,就像Java中那样。

大多数Python开发人员不会嵌套类,因此这样做会违反约定并增加维护成本。



 类似资料:
  • 问题内容: 我正在编写自己的容器,该容器需要通过属性调用来访问内部的字典。容器的典型用法如下: 我知道写这样的东西可能很愚蠢,但这就是我需要提供的功能。我正在考虑通过以下方式实现此目的: 我不确定嵌套的try / except块是否是一个好习惯,所以另一种方法是使用and : 或者使用其中之一,然后尝试使用catch块,如下所示: 哪个选项最适合pythonic和优雅? 问题答案: 您的第一个例子

  • 问题内容: 我知道关键字存在于Java中。但是我不记得看到使用它的代码。可能我正在使用异常,并在本可以使用的地方登录。在Java中使用关键字是否是一种好习惯? 编辑 :我知道断言通常是一个好习惯。我的问题是,更准确地说,如果在Java中断言的BKM是使用关键字而不是使用异常,日志记录和其他技术。 问题答案: 不使用断言的主要原因是因为默认情况下未启用断言。因此,如果您的条件足够重要而需要断言,则不

  • 问题内容: 我发现了这种模式(或反模式),对此我感到非常满意。 我觉得它非常敏捷: 有时我用它的表弟: 我不需要创建人为的元组并计算参数并将%s匹配位置保留在元组中。 你喜欢它吗?您会/会使用它吗?是/否,请解释。 问题答案: 对于小型应用程序和所谓的“一次性”脚本,这是可以的,尤其是@ kaizer.se提到的增强功能和@RedGlyph提到的版本。 但是,对于维护寿命长且维护人员众多的大型应用

  • 问题内容: 关于Javadoc的内容不多。(简而言之:它返回字符串的规范表示形式,从而允许使用来比较内部字符串==) 我什么时候可以使用此功能? 是否存在Javadoc中未提及的副作用,即JIT编译器或多或少的优化? 还有其他用途吗? 问题答案: 我何时会使用此函数来支持String.equals() 当你需要速度时,因为可以按引用比较字符串(==比等于快) 是否有Javadoc中未提及的副作用?

  • 问题内容: 我已经读过一些关于Java 8(不幸的是我不记得在哪里)的目的的信息,我很惊讶作者没有提到在类中使用as作为属性。 由于我在课堂上经常使用可选选项,因此我想知道这是否是一种好习惯。还是我可以只使用普通属性,当未设置普通属性时返回这些属性? 注意: 看来我的问题是基于观点的,但是我觉得在课堂上使用它的感觉真的不是走的路(在阅读了所提到的文章之后)。但是,我喜欢使用它,并且找不到使用它的任

  • 问题内容: 该方案。我在写与游戏相关的代码。在该游戏中,(同时也是一个类)具有的列表。有迹象表明,从继承其他类型的项目,例如,或。 显然,拥有我很方便。但是,当我获得玩家物品时,我唯一可以区分哪种物品的方法就是使用关键字。我确信我已经读过,依赖它是不好的做法。 在这种情况下可以使用吗?还是我应该重新考虑我的所有结构? 问题答案: 假设我正在写一些库存代码: 这样可以编译并正常工作。但是它错过了面向