【问题标题】:How to check a dictionary for a class object value?如何检查字典中的类对象值?
【发布时间】:2012-07-18 21:48:11
【问题描述】:

我有一本字典,名叫

descendDict

它包含 4 个键,它们是类对象,它们的值既是字母又是其他类对象。

现在我要做的是对字典进行排序,如果字典中出现的值是类对象或者是字母,则调用不同的操作:

for x in descendDict:
    print x, descendDict[x]
        for y in descendDict[x][0]:
            if y != (classObject?):
                #Action
            for x in descendDict:
                for z in descendDict[x][0]:
                    if z != (classObject?):
                        if y == z:
                            dist = 0
                        else:
                            dist = float(nodeDict[y]) + float(nodeDict[z])

在 if 语句中:

if... != (classObject?):

我正在尝试确定字典中的变量是否是类对象,但我只是不知道该怎么做。

这是其中一个条目:

<__main__.Node instance at 0xb6738> ([<__main__.Node instance at 0xb6710>, 'A', <__main__.Node instance at 0xb6760>], '0.1')

我正在对它的第一个键列表进行排序,但我试图确定列表中的值是类对象还是字母。

【问题讨论】:

  • if isinstance(d[x],MyClass):
  • 类对象是什么意思?类实例?你说的字母是什么意思?字符串?
  • 如果您只有两种类型(“类对象”或“字母”),您可以测试它是否是“字母”,而不是恕我直言,假设字母是字符串,我认为这会更容易,你可以这样做:isinstance(d[x], basestring) .
  • 听起来您正在尝试创建自己的对象调度系统。停止这样做,并将其重构为仅使用 python 对象系统。
  • -1 用于误导性问题。您选择的答案不是处理类对象,而是类实例。

标签: python class object dictionary key


【解决方案1】:

不确定您所说的“类对象”是什么意思,因为 Python 中的所有内容都是一等对象。如果您想确定它是否是特定类的实例,您可以使用isinstance

if isinstance(y, someClass):
    # do stuff

【讨论】:

  • 啊,非常感谢,我的代码现在完美运行,我能够检查我之前创建的类实例。
【解决方案2】:

最好在你的类中定义一个方法然后说

if hasattr(d[x],myClassMethodName):#then do this
else:#not a member

这种检查方法具有更大的灵活性

为@RussellBorogove

 try:
    d[x].myMethod(*args,**kwargs)
 except:
    print "This is not an instance of my class and maybe a letter"

【讨论】:

  • +1 因为它更好,但这只是表明这是 OP 创建自己半生不熟的对象系统的一种方式。
【解决方案3】:

你可能想要isinstance(x,type):

x = str
isinstance(x, type)
#=> True     

class x(object):pass    
isinstance(x, type)    
#=> True

class x:pass    
isinstance(x, type)
#=> False

x = "foo"
isinstance(x, type)
#=> False

显然,您必须坚持新式课程,但无论如何您都应该这样做。

但是,听起来您好像在尝试创建自己的对象调度系统。我强烈建议您为所有对象迁移到某种通用基类,并使用方法分派与高阶方法相结合来实现您想要做的任何事情。

【讨论】:

  • @RussellBorogove 公认的答案是使用isinstance,无论如何,问题是如何检测“类对象”。您是否有更好的方法,或者您是否盲目地否决了带有isinstance 的任何答案?此外,您显然没有费心阅读我的最后一段。
  • 那么你现在要否决我的其他 200 个答案,还是停在 3 点?
  • 我没有发现你的最后一段引人注目,因为它没有以对 Python 程序员新手有帮助的方式呈现。没必要这么个人化。
  • @RussellBorogove 无论我遇到什么,我都会亲自采取不假思索的机器人反应。
【解决方案4】:

在 Python 中,通常使用“请求宽恕比许可更容易”(EAFP)模型,如下所示:

for y in collection:
    try:
        # treat it like it's a Node
        y.actionMethod()
    except AttributeError:
        # that method doesn't exist, so it's not a Node
        # do something else with it
        print y

这比使用isinstance() 更可取,因为它允许您定义几个原本不相关的类,每个类都有自己的actionMethod(),而无需更改此调度代码。

【讨论】:

  • 有人能具体解释一下为什么 EAFP 被认为比 LBYL 更好吗?与 LBYL 一样,读者更清楚正在发生什么,python 的核心原则之一是可读性和简单性(我想这本身就是一个问题)
  • -1 该问题并未确定 OP 正在寻找的单一方法,并且确实指定了 OP 正在寻找区分类型。
猜你喜欢
  • 1970-01-01
  • 2021-01-22
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2016-03-20
  • 1970-01-01
  • 2014-12-09
相关资源
最近更新 更多