【问题标题】:How to map objects to integers in python?如何将对象映射到python中的整数?
【发布时间】:2013-06-21 20:07:21
【问题描述】:

我想要一个从名为 MyObject 的类的对象到整数的映射。我读了一些东西here,但什么都不懂,这似乎不是我想要的。哈希函数 只能用于碰撞。我想要做的是通过检索值(整数) 将对象作为参数。基本上我要找的是一个函数(用数学术语) 从 MyObject 到整数。

所以假设这是我的类的定义:

class MyObject:
    def __init__(self,number):
        self.name = name
        self.marked=False

例如

a=MyObject("object 1")
b=MyObject("object 2")

现在我想要一些像 f 这样的映射,我可以将 25 分配给 a,将 36 分配给 b。 并且能够得到:

f(a)=25
f(b)=36

【问题讨论】:

  • 如果您想将对象映射到任何东西,请使用哈希表。为此,您需要哈希和相等方法。
  • @larsmans 我在哪里可以阅读和了解它?
  • @Naji 如果你想让f(a) 是25,你是在声明a=MyObject(25) 吗?还是将a 仍声明为a=MyObject(12)
  • @Imagine 不!对象有名称。但我也想要一个像 f 这样的函数,它将 25 分配给 a 并将 36 分配给 b,这已被 Nik 所回答。无论如何,谢谢。

标签: python oop hash dictionary


【解决方案1】:

我不完全理解你的问题。我的解释是你想使用对象来索引一些整数。如果这是意图,您可以使用dict

class MyClass:
    # your code here

c1 = MyClass()
c2 = MyClass()

D = dict({c1:1,c2:2})

D[c1] # will return 1
D[c2] # will return 2

【讨论】:

    【解决方案2】:

    从您的问题来看,您似乎希望将对象作为字典的键:

    d = {a: 25, b: 36}
    assert d[a] == 25
    

    但这没有多大意义,因为您可以将数字直接存储在对象中。

    class MyObject:
        def __init__(self, name, number):
            self.name = name
            self.number = number
    
    a = MyObject("a", 25)
    b = MyObject("b", 36)
    

    也许您需要将数字与对象相关联?

    d = {25: a, 36: b}
    assert d[25] == a
    

    【讨论】:

    • 当你想要让对象 b 返回一些关于对象 a 的信息时,它确实有意义! :)
    【解决方案3】:

    您似乎在谈论 id() 函数。来自manual:返回一个对象的“身份”。这是一个整数(或长整数),保证该对象在其生命周期内是唯一且恒定的。具有不重叠生命周期的两个对象可能具有相同的 id() 值。

    【讨论】:

      【解决方案4】:

      这是你的意思吗?

      class MyObject:
          def __init__(self,name):
              self.name = name
              self.number = None
      
      a = MyObject("a")
      a.number = 25
      
      f = lambda x : x.number
      print f(a) #prints 25
      

      【讨论】:

        【解决方案5】:

        这个怎么样:

        id(myObj)
        

        这应该返回对象 ID(作为整数)

        根据您的编辑,字典应该可以满足您的需求:

        # a and b are instances of your object
        f = {}
        f[a] = 25
        f[b] = 36
        

        然后你可以访问整数:

        print f[a]
        >>> 25
        

        【讨论】:

          【解决方案6】:

          您不能以这种方式使用赋值运算符:“my_object_instance=number”,但您可以重载其他一些运算符,例如,“

          class MyObject:
              def __init__(self,name):
                  self.name = name
              def __lshift__(self, num):
                  self.name = str(num)
          
          def f(a):
              return a
          
          a = MyObject(100)
          print(a.name)
          
          f(a) << 10
          print(a.name)
          

          http://ideone.com/whn20i

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-12-17
            • 1970-01-01
            • 2013-01-06
            • 1970-01-01
            • 1970-01-01
            • 2021-12-01
            • 2019-05-27
            • 2022-11-24
            相关资源
            最近更新 更多