将唯一字典地址传递给类实例

时间:2015-05-23 00:00:03

标签: python json oop

这里我从不同的网站上提取json数据,我打算将一些重新获取的信息嵌入到实例变量中。问题是,检索到的json包在不同的键和列表位置保留了我想要的信息,因此每个字典地址对于每个网站都是唯一的。

我正在努力寻找一种创建类的新实例并传递不同的字典键来查找新数据的方法。

这样的事情我觉得太容易了......

import requests, json

class B(object):

    def __init__(self, name, url, size, price):

        self.name = name
        self.url = url

        self.size_address = size
        self.price_address = price

        self.size = 0
        self.price = 0

        self.data = {}

    def retrieve(self):
        #Data grab from web
        try:
            grab = requests.get(self.url, timeout=10)
            self.data = tick.json()
        except:
            raise RuntimeError(self.name + 'Error')


    def size(self):
        self.size = data[self.size_address]
        print self.size

    def price(self):
        self.price = data[self.price_address]
        print self.price

>>> a = B('Dave','www.dave.com/api',['names'][0]['size'],[['names'][0]['prices'][0])
>>> a.size()
42030.20

我已经看过抽象方法以及在类定义之外编写的绑定函数。绑定函数看起来很有希望,但我无法为每个具有不同变量的类创建相同的函数,因为我将使用相同的名称。

希望有人能指出我正确的方向。

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是使用design-pattern decorators通过martineau(感谢method injection进行更正)。

假设您从以下课程开始:

class Info(object):
    def __init__(self, data):
        self.data = data

此类使用字典data并存储它。问题是,密钥可能会在实例之间发生变化。

如,

a1 = Info({'a': 3, 'b': 4})
a2 = Info({'c': 5, 'b': 4})

然后我们意识到,对于a1,关键是a,但对于a2,关键是c

所以,我们可以写一个这样的函数:

import types

def patch_it(info, key):
    def get_it(info):
        return info.data[key]

    info.get_it = types.MethodType(get_it, info)

它接受一个Info 对象和一个键,并向其中注入一个方法get_it,当调用该键的字典值时返回该方法。

以下是一个例子:

>> a1 = Info({'a': 3, 'b': 4})
>> patch_it(a1, 'a')
>> a1.get_it()
3

>> a2 = Info({'c': 5, 'b': 4})
>> patch_it(a2, 'c')
>> a2.get_it()
5

注意

对于上面的特定示例,它是一种过度杀伤 - 为什么不向info指定成员来指定键是什么?关键是这个方法允许你以任意复杂的方式操纵Info的对象,独立于类本身。