2017-07-29 118 views
-2

我設計了這個帶有魔術變量的OOP代碼,實際上它感覺有點複雜,所以我想糾正這個代碼最簡單的一個,而不使用Magic變量。下面的代碼是Python中的繼承。想用Python代替這些Magic Variable

而且我正在學習OOPs概念的階段,請建議我最好的OOPs實踐和哪些概念在面向對象編程人員的角度來說很重要。

class Bike(): 
    bmodel = '' 
    def __init__(self,**model): 
     self.bmodel = model.get('bmodel') 
     super(Bike,self).__init__(**model) 

    def setmodelb(self,bmodel): 
     self.bmodel = bmodel 

    def getmodel(self): 
     return self.bmodel 

    def tostringb(self): 
     print("Licence",self.lno,"is Bike and Model is",self.bmodel) 

class Car(): 
    cmodel = '' 
    def __init__(self,**model): 
     self.cmodel = model.get('cmodel') 
     super(Car,self).__init__() 

    def setmodelc(self,cmodel): 
     self.cmodel = cmodel 

    def getmodel(self): 
     return self.cmodel 

    def tostringc(self): 
     print("Licence",self.lno,"is Car and Model is",self.cmodel) 

class Vehicle(Bike,Car): 
    lno = '' 
    def __init__(self,**model): 
     self.lno = model.get('lno') 
     super(Vehicle,self).__init__(**model) 

    def setlno(self,lno): 
     self.lno = lno 

    def getlno(self): 
     return self.lno 

    def tostringv(self): 
     print("Vehicle Licence is",self.lno) 



v = Vehicle() 
    v.setlno("CALIFORNIA99") 
    v.setmodelc("HONDA CITY") 
    v.tostringc() 
    v.tostringv() 

輸出

Licence CALIFORNIA99 is Car and Model is HONDA CITY 
Vehicle Licence is CALIFORNIA99 
[Finished in 0.1s] 
+4

你的繼承是完全顛倒 - 一輛車是一輛車,一輛自行車是一輛車,但一輛車不是一輛車和自行車。也不清楚你要求什麼。 [codereview.se],也許(只爲工作代碼**註釋)? – jonrsharpe

+0

目前還不清楚你在問什麼。我相信,如果你在網上搜索,你會發現解釋面向對象的大量資源。 – direprobs

+0

實際情況是不使用魔術變數那就是它。 –

回答

0

歡迎OOP。你的代碼看起來很複雜,因爲你不遵循Python約定。下面是一些基本的閱讀:

而對於一個更Python代碼:PEP 20。 最後但並非最不重要的,避免一些常見錯誤:Anti-patterns

在代碼中,你可以通過__repr__方法代替tostring。這允許做print(Car())。同樣在python中,你不需要getter和setter,因爲沒有公共或私有變量。所以只能在你的__init__self.model裏面定義。你將能夠做到:

car = Car() 
car.model = ... 
+0

那麼什麼是魔術變量,以及這個答案如何取代它們? – jonrsharpe

+0

@jonrsharpe說實話,我現在不是什麼OP所指的! – Y0da

+1

然後**不回答**,請求澄清。如果沒有人即將出現,那是OP的問題。 – jonrsharpe