簡體   English   中英

在python中初始化類中的子類

[英]Initialize subclass within class in python

我正在使用字典在Python中初始化一個類和兩個子類。 是否可以檢查init中字典中的鍵,並根據結果初始化兩個子類中的任何一個? 例如:

Class Pet():
    def __init__(self,dic):
       self.name=dic['name']
       self.age=dic['age']
       if dic['type']=='dog':
          #Initialize a dog which inherits all pet methods with name and age passed onto it 
       elif dic['type']=='cat':
          #Initialize a dog which inherits all pet methods with name and age passed onto it 


    def pet_methods():      
        # a bunch of pet methods that I would like to be inherited


    Class Dog():
       def __init__(self):
          self.dog_attributes=dic['dog_attributes']
    Class Cat():
       def __init__(self):
          self.cat_attributes=dic['cat_attributes']

if / else語句中可以使用哪些代碼? 或者有更好的方法來組織代碼嗎? 我很困惑,因為我似乎想在另一個init中調用init。

在子類中, init方法會覆蓋原始超類的init方法。 這將工作正常,是OObject Oriented Programming的導入概念。 如果你想從超類調用init方法,請執行super(self) 如果要調用任何其他方法,請執行super.method()並包含任何其他參數。

雖然這可能是通過python類的語義實現的,但我認為這是一個糟糕的設計模式,應該避免。

在面向對象的編程中,您的類應該表示數據和邏輯部分之間的划分。 你現在正在做的是耦合 Pet超類及其子類的邏輯/數據。 相反,你應該努力的是盡可能地分離你的對象。 這簡化了類之間的接口,並幫助您編寫盡可能通用的類,並使用子類來實現特定的行為。

在您的情況下,您應該在特定寵物的__init__方法中初始化不同的寵物類型。 如果以這種方式編寫代碼,從概念上講,添加新的Pet子類要容易得多 - 您需要做的就是從Pet繼承並初始化它應該是的子類。

您現在嘗試實現的方法使得實現子類變得更加困難。 實現者需要了解要在子類中設置哪些變量以掛接到Pet類初始化方案,然后需要進入Pet源並實現新功能以初始化新的Pet子類類型。 這要做得更加困難,需要編輯多個類才能實現新的子類。

這個問題還談到了你想要實現的問題。

你發布的不是你的想法。 在您的示例中,“Dog”和“Cat”不是“Pet”的子類 ,它們是內部類 我在下面發布了一些代碼,演示了如何編寫子類。 為了在你的情況下實例化不同的子類,最好使用你可以谷歌的工廠模式 ,我在下面作為一個例子。 我還設置工廠能夠通過String返回正確的子類型,但這是一種丑陋的做事方式所以我建議你不要使用這個例子。

class Pet:
    def __init__(self):
        pass

    def method1(self):
        print "Method 1 has been called."

    def method2(self):
        print "Method 2 has been called."

    def yelp(self):
        print "I am yelping"


class Dog(Pet):
    def __init__(self):
        Pet.__init__(self)

    def yelp(self):
        print "I am barking"


class Cat(Pet):
    def __init__(self):
        Pet.__init__(self)

    def yelp(self):
        print "I am meowing"


class PetFactory:
    def __init__(self):
        pass

    def acquire_dog(self):
        return Dog()

    def acquire_cat(self):
        return Cat()

    def acquire_pet_by_name(self, pet_type):
        if pet_type == "dog":
            return Dog()
        elif pet_type == "cat":
            return Cat()

這將產生:

>>> pet = Pet()
>>> dog = Dog()
>>> cat = Cat()
>>> dog.yelp()
I am barking
>>> cat.yelp()
I am meowing
>>> pet.yelp()
I am yelping
>>> pet_factory = PetFactory()
>>> pet_factory.acquire_cat().yelp()
I am meowing
>>> pet_factory.acquire_pet_by_name("cat").yelp()
I am meowing
>>> cat.method1()
Method 1 has been called.
>>> dog.method2()
Method 2 has been called.

暫無
暫無

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

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