class CIFAR10Record(object):
pass
result = CIFAR10Record()
result.height = 32
result.width = 32
result.depth = 3
這段代碼創建一個類及其實例。在Python中以這種方式創建類和實例有哪些優缺點?
這種模式的優點和缺點是什麼?
class CIFAR10Record(object):
pass
result = CIFAR10Record()
result.height = 32
result.width = 32
result.depth = 3
這段代碼創建一個類及其實例。在Python中以這種方式創建類和實例有哪些優缺點?
這種模式的優點和缺點是什麼?
此代碼使用一個類爲了「聚集」一些相關的領域。
優點是它非常靈活。該類沒有任何成員。任何函數都可以決定添加哪些字段。不同的調用可以創建這個類的對象,並以不同的方式填充它們(所以,同時,您可以擁有與不同成員相同類的對象)。
這種靈活性也是一個騙局。這缺乏結構:查看代碼並確定類將具有哪些成員更困難。獲得這樣一個對象並且迭代成員也不那麼簡單。最後,這個班級是一個極端的例子,沒有encapsulation。
總之,我認爲有更好的選擇:
如果確實需要這種靈活性(這本身就是一個問題),你可能要考慮使用dict
代替。
result = {}
result['height'] = 32
result['width'] = 32
result['depth'] = 3
這是更清晰這裏(恕我直言),其結果僅僅是字段的分組,而且更容易遍歷使用dict
's methods領域。
如果不需要這種靈活性,並且它只是一種最小化代碼量的方法,則應該考慮使用collections.namedtuple
。
import collections
CIFAR10Record = collections.namedtuple('CIFAR10Record', ['height', 'width', 'depth'])
謝謝你回答我的問題! – jiuses
@jiuses不客氣。祝你好運。 –
「這樣」你是指從外部分配實例的變量?沒關係,只要這些成員變量也初始化爲'__init__'中的某個成員變量,否則很難理解哪些成員變量存在。我不會說它有「優勢」。順便說一下,你的縮進是錯誤的。 – zvone