3

def __init__(self): ...使用 Django 一段时间后,我习惯了在不声明变量的情况下使用类。我曾经在__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示例中,urlis 不再是单个 Site 对象的属性,而是setor get。对于这种示例,您需要实例数据 - 您可以在__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 回答