class MyHTMLParser(HTMLParser):
start = False;
counter = 0;
...
これはあなたが思っていることをしません!
Java、C#、または同様の言語では、類似のコードが行うことは、allと呼ばれるオブジェクトのクラスが、初期値が。 、初期値が。MyHTMLParser
の属性start
を持つことを宣言することです。False
counter
0
Pythonではクラスもオブジェクトです。他のすべてのオブジェクトと同様に、それらには独自の属性があります。したがって、Pythonで上記が行うことはMyHTMLParser
、属性がにstart
設定されFalse
、属性がにcounter
設定された、という名前のクラスオブジェクトを作成すること0
です。1
もう1つ覚えておくべきことは、オブジェクトに属性を設定するような、裸の名前に割り当てる方法はまったくないということです。start = True
常に。という名前の変数を設定しますstart
。2
MyHTMLParser
したがって、クラスには、インスタンスに属性を設定するコードは含まれていません。クラス本体のコードはクラスオブジェクト自体に属性を設定し、のコードhandle_starttag
はローカル変数を設定します。ローカル変数はスコープから外れると破棄されます。
のコードは、同様の理由で、(設定したことのない)handle_data
という名前のローカル変数から読み取っています。start
Pythonでは、検索するオブジェクトを指定せずに属性を読み取る方法はありません。ベアstart
は、ローカル関数スコープまたは外部スコープのいずれかで、常に変数を参照しています。オブジェクトの属性self.start
を読み取る必要があります。start
self
メソッドを定義するdef
ブロックは特別なものではなく、他の関数と同じです。その後、その関数がクラスオブジェクトの属性に格納されたときに、その関数をメソッドとして分類できるようになります。したがって、このself
パラメーターは他のパラメーターと同じように動作し、実際には他の名前と同じように動作します。名前を付ける必要はありませんself
(ただし、これに従うのが賢明な規則です)。また、裸の名前の読み取りと書き込みで。の属性を検索する特別な特権はありませんself
。
それで:
クラスブロックの初期値で属性を定義しないでください。これは、各インスタンスの属性ではなく、クラスのすべてのインスタンスによって共有される値用です。インスタンス属性は、特定のインスタンスへの参照がある場合にのみ初期化できます。最も一般的には__init__
、これはメソッドで実行され、オブジェクトが存在するとすぐに呼び出されます。
属性を読み書きするオブジェクトを指定する必要があります。これは、あらゆる状況で常に当てはまります。特に、通常、メソッド内の属性を。と呼びます。self.attribute
それを適用する(そしてPythonでは必要のないセミコロンを削除する):
class MyHTMLParser(HTMLParser):
def __init__(self):
start = False
counter = 0
def handle_starttag(self, tag, attrs):
if(tag == 'TBODY'):
self.start = True
self.counter += 1
def handle_data(self, data):
if (self.start == True):
print data
1メソッドhandle_starttag
とhandle_data
は、クラスとして使用されるオブジェクトの属性である関数にすぎません。
2通常はローカル変数。であると宣言start
した場合global
、またはnonlocal
それは外部変数である可能性があります。ただし、他のオブジェクトが名前にバインドされている場合でも、近くにあるオブジェクトの属性ではありませんself
。