我有一本字典,名为
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 中的所有内容都是一流的对象。 如果您想弄清楚它是否是特定类的实例,您可以使用
isinstance
if isinstance(y, someClass):
# do stuff
最好在你的类中定义一个方法然后说
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"
您可以检查字典值是否具有“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'>'
您可能想要
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
显然,你必须坚持新式课程,但无论如何你都应该这样做。
但是,听起来您似乎正在尝试创建自己的对象调度系统。我强烈建议您为所有对象迁移到某种通用基类,并使用方法分派与高阶方法相结合来实现您想要做的任何事情。
在 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()
,而无需更改此调度代码。