【问题标题】:Looking for replacement of these Magic Variable in Python在 Python 中寻找这些魔术变量的替换
【发布时间】:2017-07-29 06:59:57
【问题描述】:

我用魔术变量设计了这个OOPs代码,实际上感觉有点复杂,所以我想把这段代码改成最简单的,而不使用魔术变量。下面的代码是Python中的继承。

我正处于 OOP 概念的学习阶段,请向我推荐最佳 OOP 实践以及从程序员工作的角度来看哪些概念在 OOP 中很重要。

 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]

【问题讨论】:

  • 您的继承完全颠倒了 - Car 是 Vehicle,Bike 是 Vehicle,但 Vehicle 不是 Car-and-Bike。也不清楚你在问什么。 Code Review,也许(仅注意工作代码)?
  • 不清楚你在问什么。我敢肯定,如果您在网上搜索,您会发现大量解释 OOP 的资源。
  • 实际条件是不要使用魔法变量就可以了。
  • 那么"magic variables"是什么意思呢?您认为应该删除其中的哪些内容?如果有的话,你没有足够 Python“魔法”;如果需要的话,setter 和 getter 应该被替换为属性。

标签: python python-3.x oop multiple-inheritance


【解决方案1】:

欢迎来到 OOP。您的代码似乎也很复杂,因为您没有遵循 python 约定。以下是一些重要的阅读材料:

还有更多 Pythonic 代码:PEP 20。 最后但同样重要的是,避免常见的陷阱:Anti-patterns

在您的代码中,您可以将tostring 替换为__repr__ 方法。这允许做print(Car())。同样在 python 中,您不需要 getter 和 setter,因为没有公共或私有变量。所以只在你的__init__:self.model 中定义。你将能够做到:

car = Car()
car.model = ...

【讨论】:

  • 那么什么是魔法变量,这个答案如何取代它们?
  • @jonrsharpe 老实说,我现在不知道 OP 指的是什么!
  • 然后不回答,求说明。如果没有出现,那就是 OP 的问题。
  • @jonrsharpe 您已经要求澄清。但另一点是关于如何改进和更好地分解代码的一些建议。我不需要知道这里有什么魔力就可以看出这不是pythonic并且可以改进;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多