2017-07-29 96 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