簡體   English   中英

在類定義后立即實例化python對象

[英]instantiate python object immediately after its class definition

在一個大型python項目(openerp)中,我遇到了以下幾種模式:

在模塊中,定義了具有其方法的類。 然后,在同一模塊中並在類定義之后立即實例化該類的實例,然后從其他模塊調用該實例。

# in module_A.py:
class ClassA(object):

    def __init__(self, default="Hello world!"):
        self.default = default 

    def my_method(self, data):
        print self.default
        print data

object_a = ClassA()

對我來說,將方法定義為模塊函數看起來更簡單,沒有類查找重載:

# in module_B.py:

default = "Hello world!"

def my_method(data):
    print default
    print data

從其他模塊看,用法非常相似:

from module_a import object_a as prefix
prefix.my_method("I'm so objective!")

與:

import module_b as prefix
prefix.my_method("I'm so modular!")

是否有理由更喜歡模式A而非模式B? 或者模式B更pythonic?

有時,您希望不同的客戶端能夠使用不同設置的模塊,使它們不會相互沖突。 例如,Python的random模塊提供了一堆隨機數生成函數,這些函數實際上是隱藏的Random實例的綁定方法。 大多數用戶並不太關心什么算法生成他們的隨機數或者是否其他模塊要求隨機數會改變序列。 但是,關心用戶可以獲得自己的Random對象並生成隨機數序列,這些序列不會受到其他要求隨機數的模塊的影響。

有時,現在全球化的東西可能並不總是全球性的。 例如,如果你正在使用行星級RTS,你可能會有一個帶有一個實例的Planet類,因為戰斗只發生在一個星球上。 但是,你不想排除建立像行星湮滅這樣的東西的可能性,在整個太陽系中進行戰斗,並將滅絕事件小行星作為超級武器。 如果你擺脫了Planet類並使其方法和屬性處於模塊級別,那么以后再回過頭來添加更多行星會更加困難。

有時,讓對象做事而不是模塊更具可讀性。 例如,假設模塊joebob定義了兩個對象evil_overlord_bobgood_guy_joe

class Bob(object):
    def slaughter_everything(self):
        print "Muahahaha! Die for my amusement!"
class Joe(object):
    def stop_bob(self):
        print "I won't let you hurt those innocents!"
evil_overlord_bob = Bob()
good_guy_joe = Joe()

假設Bob和Joe是非常獨特的人。 你想要創建像鮑勃或喬這樣的另一個對象是不可想象的。 在這種情況下,您可以將slaughter_everythingstop_bob移動到模塊級別,並完全擺脫Bob和Joe類和對象。 但是,那你就是在寫作

joebob.slaughter_everything()
joebob.stop_bob()

如果你能說,那就更清楚了

evil_overlord_bob.slaughter_everything()
good_guy_joe.stop_bob()

即使你永遠不需要實例化Bob的同等邪惡的雙胞胎兄弟greg_the_fleshripper

除了其他好處之外,使用類允許您在實例上使用內省,這是您無法對函數執行的操作。

以更一般的方式,兩種方法都是“pythonic”。 使用其中一個真正取決於項目的類型(小/大,有/沒有GUI,...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM