[英]Python Class Inheritance: How to initialize a subclass with values not in the parent class
[英]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.