-2

我有一本字典,名为

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')

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

4

4 回答 4

1

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

if isinstance(y, someClass):
    # do stuff
于 2012-07-19T16:43:57.293 回答
1

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

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"
于 2012-07-19T16:44:04.717 回答
-1

你可能想要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

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

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

于 2012-07-19T16:51:44.587 回答
-1

在 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

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

于 2012-07-19T17:56:36.910 回答