如何检查字典中的类对象值?

问题描述 投票:0回答:5

我有一本字典,名为

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

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

python class object dictionary key
5个回答
1
投票

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

isinstance

if isinstance(y, someClass):
    # do stuff

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"

0
投票

您可以检查字典值是否具有“dict”属性:

class A:
    def __init__(self):
        self.x = 1
        self.y = 2
        self.z = 3

    def sss(self):
        self.x += 1


a1 = A()
a2 = A()
d: dict = {1: 1, 2: a1, 3: "ajwsn", 4: a2}

for key, value in d.items():
    if hasattr(value, "__dict__"):
        print(f"'{value}' is of type '{type(value)}'")

=>

A value for '2' key is of type '<class '__main__.A'>'
A value for '4' key is of type '<class '__main__.A'>'

-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

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

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


-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

这优于使用

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

© www.soinside.com 2019 - 2024. All rights reserved.