Python样式问题:支持类作为内部类?

时间:2011-01-19 12:05:29

标签: python formatting coding-style

我喜欢使用语言中内置的结构来组织我的代码。但有一种情况我不能保持一致,仅仅是因为我没有看到明确的最佳方式。它是关于支持类,即由另一个类在内部专门使用的类:我是将它们作为内部类还是单独的类。

内部课程:

class Complicated:
    class Utility1:
        pass
    class Utility2:
        pass
    pass

单独的课程:

class Complicated:
    pass

class Utility1:
    pass

class Utility2:
    pass

内部类具有在使用它们的唯一类中限定范围的优点。但问题是由于缩进,我得到的代码空间更少。

外课没有优势也没有劣势。我厌倦了每当我写支持课时都会花费一些精力,对这个愚蠢的问题感到疑惑。

我的问题是,任何拥有丰富python经验的人是否可以建议是否有最佳实践?即使答案是“它取决于”,但如果它来自一个比我更有经验的人,我们将不胜感激。

4 个答案:

答案 0 :(得分:6)

我建议

class Complicated:
    pass

class _Utility1:
    pass

class _Utility2:
    pass

并将所有这些放在自己的模块中。前导_表示实用程序类仅供内部使用(对于它的内容,它们不会被from module import *导入;但我不喜欢这样做。)

修改:引自PEP 8

  

内部使用的类别还有一个前导下划线。

答案 1 :(得分:1)

我使用单个下划线作为python包内部类的前缀。我认为这是一种常见的python模式:

class Complicated:
    pass

class _Utility1:
    pass

class _Utility2:
    pass

答案 2 :(得分:0)

我是否使用内部类或外部类很大程度上取决于我是否希望在子类或每个实例的基础上覆盖类型:

class Foo(object):
    normalize = str

    def process(self, input):
        # Do some stuff in here...
        return self.normalize(output)

class UniFoo(Foo):
    normalize = unicode

class TotallyMungedFoo(Foo):
    class normalize(object): ...

如果我不期望需要(或明确不希望)这样的行为,我在同一模块中使用类,但只在我的__all__声明中包含“重要”类。

答案 3 :(得分:0)

Python内部类

Python内部类可以创建和使用。 与其他语言(如Java)不同,Python内部类不会自动为您提供对外部类属性和方法的访问。

解决此问题的方法: 使用父参数定义所有内部类。此参数可用于访问外部类属性和方法。

具有内部类的Python示例类

class Outer:
    def __init__(self):
        self.myVar = 100
        self.inner = self.Inner(self)

    def getDoubleVar(self):
        return(self.myVar * 2)

    #Define inner class
    class Inner:
        def __init__(self, parent):
            self.parent = parent

        #Use the parent variable to access parent class attributes/methods
        def printOuterVar(self):
            print(self.parent.myVar)

        def callOuterMethod(self):
            return(self.parent.getDoubleVar())




#Create Instance of Outer Class
outer = Outer()

#Display myVar
print("Display myVar")
print(outer.myVar)


#Execute Outer Method
print("\nExecute Outer Method")
print("val = outer.getDoubleVar()")
val = outer.getDoubleVar()
print("val: {0}".format(val))

#Execute Inner Method
print("\nExecute Inner Method")
print("outer.inner.printOuterVar()")
outer.inner.printOuterVar()

#Execute Inner Method That Calls Outer Method
print("\nExecute Inner Method That Calls Outer Method")
val = outer.inner.callOuterMethod()
print("val = outer.inner.callOuterMethod()")
print("val: {0}".format(val))

#Create Instance of Inner Class Separately
print("\nInstantiate Inner Class Separately")
#Note that you provide the current outer instance as the parent parameter
print("Note that you provide the current outer instance as the parent parameter")
print("myInner = outer.Inner(outer)")
myInner = outer.Inner(outer)

#Call Inner Method
print("\nCall Inner Method")
print("myInner.printOuterVar()")
myInner.printOuterVar()
print("finished")