变量包含classobj - 好风格?

时间:2014-02-14 13:27:44

标签: python coding-style

Python样式问题。

有时我会将类分配给变量,以便我可以在其他地方实例化它们,例如:

class GuitarItem():
    pass

class SuperClass():
    def get_instance(self):
        return self.Item()

class SubClass(SuperClass):
    Item = GuitarItem

class SubClass2(SuperClass):
    Item = PianoItem
这是好风格吗?我错过了一种更惯用的方法吗?它让我担心,因为item没有大写(因为它是一个变量)所以它看起来像一个方法调用。

更新:根据Hyperboreus的评论,我正在利用Item,这对我来说也更为明智。否则这似乎绝对没问题。

3 个答案:

答案 0 :(得分:2)

解决您的主要问题:

  

有时我会将类分配给变量,以便我可以实例化它们   别的(...)这是好风格吗?我错过了一种更惯用的方式   这样做?

Python的类(以及函数,方法,模块等)都是普通的对象,就像其他任何东西一样,是的,它是“好的风格”而不是,没有“更惯用的方式”。

  

它让我担心,因为item没有大写(因为它是一个变量)所以   它看起来像一个方法调用。

它实际上最终是一个方法调用(它调用元类的__call__方法,后者又调用类的__new__方法。另外FWIW你不关心item是否实际上是一个类,任何可调用的返回预期对象都会(并且将会)工作,所以CamelCasing它没有任何意义。

答案 1 :(得分:1)

不太确定,但也许你正在寻找这些方面的东西。是的,为什么不在另一个范围内给一个类另一个名字。

#! /usr/bin/python3

class GuitarItem: pass

class PianoItem: pass

class SuperClass:
    def makeItem (self): #or whatever you want to do with the Item class
        return type (self).Item ()

class SubClass (SuperClass): Item = GuitarItem

class SubClass2 (SuperClass): Item = PianoItem

print (SubClass ().makeItem () )
print (SubClass2 ().makeItem () )

这将首先制作吉他,然后制作钢琴。

答案 2 :(得分:0)

我建议使用工厂方法模式,因为它与你所做的非常相似,业界知道这种模式。 http://en.wikipedia.org/wiki/Factory_method_pattern

class GuitarItem(): pass 
class PianoItem(): pass

class SuperClass():

    def __init__(self)
        self.item_instance = self.new_item()

    def new_item(self):
        """Explain why it should provide item."""
        raise NotImplementedError("Subclass of SuperClass must provide new_item method")


class SubClass(SuperClass):
    def new_item(self):
        return GuitarItem()

class SubClass2(SuperClass):
    def new_item(self):
        return PianoItem()