2017-06-05 18 views
1

我想通过扩展总是具有相同的第一阶段的方法,子类化说:如何在Python 3中重用超类方法的变量?

class Data: 
    def show(self): 
    # this part is common for all subclasses 
     total=10 

class PrintA(Data): 
    def show(self): 
     Data.show(self) 
     print(total) 

class PrintAPlus(Data): 
    def show(self): 
     Data.show(self) 
     print(total+10) 

不过,我得到NameError: name a is not defined

如何重用total变量从超类的方法? (最明显的一种是将其保存为实例的属性,但我不需要在那里,其实。)

+0

简短的回答返回值:你不能。 – jonrsharpe

+7

*明显的是将它作为实例的属性* < - yep保存,就是这样。或者你可以从父方法返回它,并使用该返回值。 – wim

+0

如果你不想'total'作为公共属性,你可以在它之前用'_'定义它为private。但是,通过将'total'定义为属性(无论是公共还是私人取决于你)来做到这一点的正确方法是 –

回答

2

这里的问题是,total只超类方法show内部分配,存在的仅仅是局部变量。它的价值无法在其外面看到。

解决它,你需要使它成为一个实例属性或从那里

选项1

class Data: 
    def show(self): 
    # this part is common for all subclasses 
     self.total = 10 

class PrintA(Data): 
    def show(self): 
     Data.show(self) 
     print(self.total) 

class PrintAPlus(Data): 
    def show(self): 
     Data.show(self) 
     print(self.total+10) 

选项2

class Data: 
    def show(self): 
    # this part is common for all subclasses 
     return 10 

class PrintA(Data): 
    def show(self): 
     total = Data.show(self) 
     print(total) 

class PrintAPlus(Data): 
    def show(self): 
     total = Data.show(self) 
     print(total+10) 
+0

也就是说,父级的方法及其扩展不具有相同的范围? – homocomputeris

+0

@homocomputeris不,每个人都有自己的范围 – Copperfield

相关问题