【问题标题】:PYTHON: How to access class object's members if the object is a key in a dictionaryPYTHON:如果对象是字典中的键,如何访问类对象的成员
【发布时间】:2021-08-12 11:18:58
【问题描述】:

我有以下课程:

class car_class(object):
    def __init__(self, mileage=11, tyre_size=11):
        self.mileage = mileage
        self.tyre_size = tyre_size
        self.default_val = ''
        
    def __hash__(self):
        return hash((self.mileage, self.tyre_size))

    def __getitem__(self, default_val):
        return self.default_val

    def __setitem__(self, default_val, mileage, tyre_size):
          self[default_val] = str(mileage) + '_' + str(tyre_size)

    def __eq__(self, other):
        return (self.mileage, self.tyre_size) == (other.mileage, other.tyre_size)

    def __str__(self):
    return ('dict_cl: (tyre_size=\'%d\', mileage=\'%d\'' % (int(self.tyre_size), int(self.mileage)))

def __repr__(self):
    return ('dict_cl: (tyre_size=\'%d\', mileage=\'%d\'' % (int(self.tyre_size), int(self.mileage)))

    def __ne__(self, other):
        # Not strictly necessary, but to avoid having both x==y and x!=y
        # True at the same time
        return not(self == other)

我还有一个字典,它把这个类的对象作为键值,如下所示-

my_dict = dict()
dict_value_list = list()
mm_dict_cl = car_class()
mm_dict_cl.mileage = 29
mm_dict_cl.tyre_size = 265
dict_value_list.extend(['car_color'])
my_dict.update(mm_dict_cl = dict_value_list)

因此字典(my_dict)键将类对象(mm_dict_cl)作为键,car_color 作为该键的值。 Key是类对象本身,有mileage和tyre_size两个属性。

现在,当我打印字典的以下值时,我得到的值为 car_color -

`>>>` print(my_dict[next(iter(my_dict))])
['car_color']

但是我正在努力寻找一种方法来检索类对象的属性。

>>>` print(next(iter(my_dict)))

mm_dict_cl

如果打印为字符串,则打印类名和键类型。

`>>>` print(type(next(iter(my_dict))))

<type 'str'>

查询:我如何才能访问密钥的对象属性? 我想使用字典 my_dict 的键检查特定“car_color”的 tyre_size 和 mileage 的值是多少 请帮助,这里是新手,正在尝试学习这种语言。

-edit:修复了对列表的扩展调用,以将“car_colour”添加​​为列表,而不是 SorousH Bakhtiary 指出的字符串。

【问题讨论】:

    标签: python-3.x class dictionary oop


    【解决方案1】:

    这里的问题是您将类实例的 name 存储为字典中的键(“它是字符串”),因此您无法控制实例,而是因为您的对象在全局命名空间中定义,你可以像这样检索它:(我暂时简化了你的类)

    class car_class:
        def __init__(self, mileage=11, tyre_size=11):
            self.mileage = mileage
            self.tyre_size = tyre_size
            self.default_val = ''
    
    
    my_dict = {}
    dict_value_list = []
    mm_dict_cl = car_class()
    dict_value_list.append('car_color')
    print(dict_value_list)
    
    mm_dict_cl.mileage = 'temp1'
    mm_dict_cl.tyre_size = 'temp2'
    my_dict.update(mm_dict_cl=dict_value_list)
    
    # here :
    obj = globals().get(next(iter(my_dict)))
    print(obj.mileage)    # prints temp1
    print(obj.tyre_size)  # prints temp2
    

    顺便说一句,您应该使用append 而不是extend 方法来添加'car_color'

    【讨论】:

    • 感谢您的信息。但是您如何建议我将类的实例存储为键而不是将实例的名称存储为字符串本身?
    • @ThatDude 类最初是可散列的。当您实现__eq__ 方法时,它们变得不可散列,因此您也必须实现__hash__。在你的情况下,你已经做到了。就这样:my_dict[mm_dict_cl] = dict_value_list。不要将update 与命名参数一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2011-05-13
    • 2013-12-30
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多