2017-08-25 188 views
0

我已经学习了以JAVA为第一语言的OOP原则,然后我已经转移到Python,所以这个特殊的功能对我来说看起来有点奇怪,虽然在很多情况下很有用。在父类中访问子类属性是一个好主意

但是,我想知道它是否真的可取。

以下将在JAVA中给出错误,因为您不能在父类中访问子类的属性。

class parent(object): 
    def print_x(self): 
     print self.x 


class child(parent): 
    x = 10 

child().print_x() 

PEP8也给在这种情况下,一个警告:

未解决的属性引用 'X' 类 '父'

代码遍历和调试变得有点问题我个人想法。

+5

既然你可以* *'实例上parent'其自身,这将产生一个错误,*是*,这是有问题的。 Python比Java更具动态性,并且在编译时不检查它。与Java中的原因一样,它仍然是不好的代码。 – deceze

回答

3

也许这是一个地方,依赖注入会更合适(组成与继承)。一个“父母”深入到它的“孩子”充其量是可疑的。

怎么样的线沿线的东西更多:

class Container(object): 
    def __init__(self, child_instance): 
     self.child = child_instance 

    def print_x(self): 
     print self.child.x 

class Child(object): 
    def __init__(self, x): 
     self.x = x 

child = Child(10) 
parent = Container(child) 
parent.print_x() 

有许多优点,以代替继承的成分在许多情况下,像这样的,我强烈建议你研究他们。

+1

你的意思是'打印self.child.x'吧? –

+0

@GaurangShah绝对,thx! – smassey

1

更清洁的方法是

class Parent(object): 

    @property 
    def x(self): 
     raise NotImplementedError 

    def print_x(self): 
     print self.x 


class Child(Parent): 
    x = 10