从另一个文件中的一个文件访问类实例?

时间:2011-09-02 23:32:06

标签: python class instance

我有两个文件,都在同一个项目中(Web抓取框架的一部分)。 File1处理由File2生成的项目。在File2中,我有一个函数可以打印出有关进程的一些基本统计信息(生成了多少项的计数等)。我在File1中有计数,我想用File1的统计数据打印但不确定如何做到这一点。看一下示例代码。

文件1:

class Class1(object):
    def __init__(self):
        self.stats = counter("name") #This is the instance that I'd like to use in File2
        self.stats.count = 10

class counter:
    def __init__(self, name):
        self.name = name
        self.count = 0
    def __string__(self):
        message = self.name + self.count
        return message

文件2 :(这是我想做的)

from project import file1 # this import returns no error

def stats():
    print file1.Class1.stats # This is where I'm trying to get the instance created in Class1 of File2.
    #print file1.Class1.stats.count # Furthermore, it would be nice if this worked too.

ERROR:

exceptions.AttributeError: type object 'Class1' has no attribute 'stats'

我知道两个文件都在运行,因此'counter'类的'stats'实例也是如此,因为在运行项目时打印出其他方法(这只是一个简单的例子。我在做什么这里错了吗?这可能吗?

3 个答案:

答案 0 :(得分:6)

这不起作用,因为您从未实例化Class1

实例化__init__时会调用

Class1,因此设置了Class1.stats

这里有2个选项。

  1. 以某种方式在文件2中实例化Class1
  2. Class1中声明一个返回count属性的静态方法。

答案 1 :(得分:2)

在File1中,创建Class1的实例,并使用它来获取计数。

class Class1(object):
    def __init__(self):
        self.stats = counter()
        self.stats.count = 10

class counter:
    def __init__(self, name):
        self.name = name
        self.count = 0
    def __string__(self):
        message = self.name + self.count
        return message

class_instance = Class1()

在file2中,使用创建的实例:

from project import file1

def stats():
    print file1.class_instance.stats

答案 2 :(得分:2)

你的术语有点混乱。 “这两个文件都在运行,因此”计数器“类的'stats'实例” - stats也是{{>对象的属性{{1} 1}}类。如果你想要计算创建了多少个类的实例,你应该使用类属性,它是绑定到你的类的东西,而不是它的实例。

counter

那么这可以像这样使用,

class Counter(object):
    count = 0

    def __init__(self, name):
        self.name = name
        Counter.count += 1
        self.id = Counter.count

    def __repr__(self):
        return '<Counter: %s (%d of %d)>' % (
            self.name, self.id, Counter.count)

请注意,您>>> foo = Counter('Foo') >>> print foo <Counter: Foo (1 of 1)> >>> bar = Counter('Bar') >>> print bar <Counter: Bar (2 of 2)> >>> print foo <Counter: Foo (1 of 2)> >>> 第二次更新了计数,但print foo保持不变,这是因为id是一个类属性,但是count是对象的属性,因此(使用此代码)id的创建不会影响bar的{​​{1}},但会增加id