3

Django をしばらく使用した後、def __init__(self): ...変数を宣言するときにクラスを使用することに慣れました。以前は関数で変数を宣言していました__init__が、必要のない場合があることに気づきました。いつ使用するかどうかが不明です。クラスを変数に渡そうとすると問題があるようですが、このような場合にinitを使用する必要がありますか?

すべての場合に使用できることはわかって__init__いますが、短いクラスがなくてもきれいになるだけなので、いつ使用できるか、使用できないかを知りたいです。

例:

class BaseScraper(object):
    # whithout __init__, passing Site() to site wont work.
    # site = Site()
    # parser = None

    def __init__(self):
        self.site = Site()
        self.parser = None 


class Site(object):
    # no trouble declaring url as a str
    url = ""

    def set(self, url):
        self.url = url

    def get(self):
        return self.url



if __name__ == "__main__":
    scraper = BaseScraper()

    scraper.site.set('http://www.google.com')   
    print scraper.site.get()
4

2 に答える 2

6

クラスで宣言された属性は、クラスの個々のインスタンスではなく、クラスによって所有されます。あなたのsite例でurlは、個々の Site オブジェクトのプロパティではありませsetget。この種の例では、 で初期化できるインスタンス データが必要です__init__

Python: クラス属性とインスタンス属性の違いには、違いに関する適切な説明があります。

于 2013-05-14T22:42:16.607 に答える
1

Siteクラスがまだ定義されていないため、これは失敗します。そして(@Peter DeGlopperが言ったように)、クラス変数とインスタンス変数には大きな違いがあります。

class BaseScraper(object):
    # This fails!
    site = Site()
    parser = None


class Site(object):
    # no trouble declaring url as a str
    url = ""

    def set(self, url):
        self.url = url

    def get(self):
        return self.url

仮想マシンが python モジュールをコンパイルするときは、クラス宣言のすべてを読み取ってコンパイルしますが、メソッド宣言 ( などdef __init__(...):) では、この行のみを読み取り、メソッド本体を無視します。

例:

class Foo(object):
    bar1 = "bar"
    foo1 = "foo"

    def __init__(self):
        self.bar2 = "BAZ"

foo = Foo #Put a class in a veriable? yes, you can.
foo.bar1 # returns "bar"
foo.foo1 # returns "foo"
foo.bar2 # fails!!!! This will be a instance variable, but doesn't exist yet

foo2 = Foo() # Here the __init__ is called
foo2.bar2 # returns "BAZ"
foo2.bar1 #Returns "bar" because all class variables are availables from instances

これが役立つことを願っています=)

于 2013-05-14T22:54:06.680 に答える