2012-02-15 12 views
4

は、私はPythonで「クラス」と「継承」の用法のいくつかの誤解があると思う、私は以下のように私の質問を簡素化します:。Pythonの:変数、継承、およびデフォルト引数

class A: 
    def __init__(self): 
     self.data = 100 

class B(A): 
    def b(self): 
     print self.data 

>>>B().b() 
>>>100 

OK 、これまでのところは良い、私は別のクラスを作成する場合は、何かが以下のように示されている、うまくいかない:。

class C(A): 
    def c(self, num=self.data): 
     print self.data 

>>>C().c() 
NameError: name 'self' is not defined 

私がある、self.dataに「NUM」のデフォルト値を設定したいです'100'。 'クラス'がなければ、ずっと簡単になります:

data = 100 
def d(num = data): 
    print num 

>>>d() 
>>>100 

私はすでにいくつかの記事をGoogleで検索しましたが、まだこの問題にはまっています... 事前に感謝!

答えて

9

あなたが行うと、この:あなたのような何かをやっている

class C(A): 
    def c(self, num=self.data): 
     print self.data 

>>> def d(num, data=num): 
...  print(num, data) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'num' is not defined 

そして、あなたが見るようにPythonのコンパイラは二numが何であるかを知りません。

しかし、のようなものやってからあなたを停止することは何もありません:

class C(A): 
    def c(self, num=None): 
     print num or self.data 

または明示的なNoneチェックして:

class C(A): 
    def c(self, num=None): 
     if num is None: 
      num = self.data 
     print num 
+0

素晴らしい!ほんとうにありがとう!これはまさに私が欲しいものです!ありがとうございました! – amigcamel

0

あなたはクラスメソッドを誤解しているが。クラスメソッドは暗黙的に渡されます。自己は存在しませんdef c(self, num=HERE>>>>>self<<<<<HERE.data):

あなたは何をやりたいのですか?

2

関数のパラメータのデフォルトは、関数が定義されているときに評価され、呼び出されたときには評価されません。定義時には、名前はないselfです。

最高のコースでは、デフォルトとしてNoneを使用しないことであり、そしてそれが何を意味するかを解釈する機能のロジックを使用します。

class C(A): 
    def c(self, num=None): 
     if num is None: 
      num = self.data 
     #.. the rest of the function .. 
3

これは、継承とは何の関係もありません。基本クラスAで同じことを試みることができ、同じ方法で失敗します。あなたは、単に欲しいものを達成するために

が行います。あなたのクラスのメソッドは、引数を取得

def c(self, num=None): 
    if num is None: 
     num = self.data 
+0

はい、そうですよ!どうもありがとう! – amigcamel

0
class C(A): 
    def c(self,data=None): 
     if data == None: 
      print self.data 
     else 
      print data 

、 あなたはself.somethingを渡すことはできません。

0

すでに述べたように、あなたはそのような '自己'変数を使用することはできません。データの値を後で変更する必要がない場合は、次の操作を実行できます。

class A: 
    data = 100 

class C(A): 
    def me(self, num=A.data): 
     print num 
関連する問題