簡體   English   中英

將對象類型作為參數傳遞

[英]Passing Object Type as Parameter

我有一些代碼希望以比我的直覺更優雅的方式實現。 我會盡我所能來描述我正在嘗試的東西。

class Fruit():
    pass

class Apple(Fruit):
    pass

class Orange(Fruit):
    pass

def create_fruit(fruit_type):
    test = ???? # code here to create instance of fruit of desired type called test

好的,所以希望這段代碼有意義。 我在一個模塊中有一個函數,它需要一堆參數來創建一個類的實例。 理想情況下,我想傳遞一個參數,說明要創建的類的類型(但它們都是同一個超類的實例或子類)。 每個子類的參數都是相同的(截至目前)。

我可能可以很容易地用 if 語句做一些事情並一起破解(比如, if fruit_type==1 , test=Apple() , if f fruit_type == 2 , test=Orange()等...),但試圖作為一名python程序員進行改進,我想知道是否有更好的方法來做到這一點。 我已經簡要地閱讀了裝飾器和函數式編程(盡管它對我來說仍然很抽象,並且需要更多時間來理解),所以也許這與此相同?

如果您只是使用類名調用 create_fruit 然后實例化參數會怎樣:

def create_fruit(fruit_type):
    test = fruit_type()

create_fruit(Apple)

(編輯以將賦值添加到“測試”變量)或者你也可以做這樣的事情,這實際上允許你在 create_fruit 之外對你創建的水果做一些事情:

def create_fruit(fruit_type):
    return fruit_type()

test = create_fruit(Apple)
test.bite()

您可以使用檢查找到可用的類並從那里創建實例

import inspect
import sys

class Fruit():
    pass

class Apple(Fruit):
    pass

class Orange(Fruit):
    pass

clsmembers = dict(inspect.getmembers(sys.modules[__name__], inspect.isclass))

def create_fruit(fruit_type):
    try:
        return clsmembers[fruit_type]()
    except:
        print('Could not match Fruit type')

fruit1 = create_fruit('Apple')
print(fruit1)
# <__main__.Apple object at 0x1105de940>

fruit2 = create_fruit('Orange')
print(fruit2)
# <__main__.Orange object at 0x1105de978>

fruit3 = create_fruit('Grape')
# Could not match Fruit type

對於如此簡單的任務,我只需使用 dict

def create_fruit(fruit_type):
    fruits = {1: Apple, 2: Orange}
    if fruit_type not in fruits.keys():
        raise Exception('fruit type does\'t exist!')
    klass = fruits[fruit_type]()
    print(klass) # <__main__.Apple object ...>

create_fruit(1)

這里有一些與您的問題非常相似的重復項

python 有相當於 Java Class.forName() 的嗎?

你能用一個字符串來實例化一個類嗎?

如何在python中動態創建類的實例?

暫無
暫無

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

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