如何在python中访问类外的类变量

时间:2015-03-25 02:31:45

标签: python class variables scope

我是python的新手,这是我在python中的第一个程序,我想知道如何访问类外的类变量。我有一个代码会引发一些错误

from xxxxxxx import Products

class AccessKey(object):
    def key(self):
        self.products = Products(
           api_key = "xxxxxxxxxxxxxxxxxxxxxx",
           api_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        )

class Data(AccessKey):
    def Print(self):
        products.products_field( "search", "Samsung Galaxy" )
        results = products.get_products()
        print "Results of query:\n", results

data = Data()
data.Print()

以上程序抛出以下错误

Traceback (most recent call last):
  File "framework.py", line 10, in <module>
    class Data(AccessKey):
  File "framework.py", line 13, in Data
    results = products.get_products()
NameError: name 'products' is not defined

2 个答案:

答案 0 :(得分:2)

首先,您需要将产品字段称为 self.products。(等)

看起来你不一定要实例化&#34;产品&#34;在你打电话之前。如果你想确保它被实例化,那么你需要在父类的构造函数中设置产品(AccessKey)

一个简化的例子是:

class A (object):
    def __init__ (self):
        self.x = 1

class B (A):
    def get (self):
        return self.x

b = B ()
print (b.get ())

基本上,您必须将以下构造函数添加到第一个类

class AccessKey(object):
    def __init__(self):
        self.products = Products (X, Y) # or whatever you want to initialize it to
    # the rest of your code below

或者,你可以做得更好并创建一个set_product函数:

# inside of the parent class
    def set_product (self, X, Y):
        try:
            self.products.product_field (X, Y)
        except NameError:
            self.products = Product (X, Y)

答案 1 :(得分:0)

班级Data继承自AccessKey。因此,products可以使用类属性Data,但是,您需要通过

访问它

self.products.products_field(...)代替products.products_field(...)。 同样,它应该是results = self.products.get_products()

但请注意,实例属性产品仅在调用方法key时设置,因此在调用NameError方法之前,您将获得key,即

data = Data()
data.key()
data.Print()

此外,在python中不鼓励使用getter和setter,并且对代码格式化指南施加了很多压力。在您的代码中,类方法应该小写,但因为print会影响一个保留的单词,所以print_之类的东西会更好。