class MyHTMLParser(HTMLParser):
start = False;
counter = 0;
...
これはあなたが思っていることをしません!
Java、C#、または同様の言語では、類似のコードが行うことは、allと呼ばれるオブジェクトのクラスが、初期値が。 、初期値が。MyHTMLParserの属性startを持つことを宣言することです。Falsecounter0
Pythonではクラスもオブジェクトです。他のすべてのオブジェクトと同様に、それらには独自の属性があります。したがって、Pythonで上記が行うことはMyHTMLParser、属性がにstart設定されFalse、属性がにcounter設定された、という名前のクラスオブジェクトを作成すること0です。1
もう1つ覚えておくべきことは、オブジェクトに属性を設定するような、裸の名前に割り当てる方法はまったくないということです。start = True常に。という名前の変数を設定しますstart。2
MyHTMLParserしたがって、クラスには、インスタンスに属性を設定するコードは含まれていません。クラス本体のコードはクラスオブジェクト自体に属性を設定し、のコードhandle_starttagはローカル変数を設定します。ローカル変数はスコープから外れると破棄されます。
のコードは、同様の理由で、(設定したことのない)handle_dataという名前のローカル変数から読み取っています。startPythonでは、検索するオブジェクトを指定せずに属性を読み取る方法はありません。ベアstartは、ローカル関数スコープまたは外部スコープのいずれかで、常に変数を参照しています。オブジェクトの属性self.startを読み取る必要があります。startself
メソッドを定義する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。