[英]comparing class instances or object not working in Python
这是我的第一次,我是Python的新手。 我正在尝试创建一个程序,该程序收集.Net Framework的发布信息,然后将其与作为此类的对象的变量d 460805的值进行比较
执行以下步骤:创建类DotNetVersion,该类可以将在代码末尾定义的变量d
的值与a.getdotnetinfo(subkeyname)的值进行比较,该值在我的PC上为460805。创建类look_get_DotNet_version将采用机器,然后定义获取SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Client
注册表值的函数,并将其返回以进行打印
import json
import os
import sys
try:
from winreg import*
except:
print ("Unable to import _winreg module! Please Check your python installation.")
exit(-1)
class DotNetVersion(object):
def __init__(self,release):
self.release = release
def __eq__(self, other):
if not isinstance(other, a.getdotnetinfo(subkeyname)):
print("not an instance")
return NotImplemented
else:
print("it is an instance")
def __str__(self):
return f'{self.release}'
class look_get_DotNet_version(object):
def __init__(self,machine):
try:
if machine == None:
self.lm_hive = OpenKey(HKEY_LOCAL_MACHINE, '')
else:
self.lm_hive = ConnectRegistry(machine, HKEY_LOCAL_MACHINE)
except WindowsError as e:
print (e)
exit(-2)
def getdotnetinfo(self, subkeyname):
output = None
try:
if subkeyname:
subkey = OpenKey(self.lm_hive, subkeyname)
release = QueryValueEx(subkey, 'Release')[0]
output = DotNetVersion(release)
except Exception as e:
print (e)
pass
return output
我创建一个变量subkeyname
:
subkeyname = r'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client'
将机器设置为无:
machine = None
创建a
如下设置self.lm_hive
为OpenKey(HKEY_LOCAL_MACHINE, '')
a = look_get_DotNet_version(machine)
创建一个值460805的字符串:
d="460805"
创建d作为类DotNetVersion的实例:
d = DotNetVersion(d)
创建b以输出版本的值:
b = a.getdotnetinfo(subkeyname)
print(b)
运行值为460805的比较b与值为460805的d进行比较:
print(look_get_DotNet_version.__eq__(b,d))
460805
NotImplemented
我被困在下面的片段中的__eq__
,应该说这是一个实例,因为other
d等于a.getdotnetinfo(subkeyname)
def __eq__(self, other):
if not isinstance(other, a.getdotnetinfo(subkeyname)):
print("not an instance")
return NotImplemented
else:
print("it is an instance")
或者您是否可以帮助我指导如何在这种情况下比较发行版。
该程序的长期愿景是,如果不匹配,则下载4.7的.NET Framework并将其安装在计算机上。
感谢您的所有帮助,如果需要任何说明,请告诉我。
我知道格式化看起来很糟糕,但我会继续努力
通过创建一个包装版本字符串的类,您使此操作变得比需要的复杂得多。 您可以轻松地直接从getdotnetinfo()
返回版本字符串并直接进行比较:
def getdotnetinfo(self, subkeyname):
output = None
try:
if subkeyname:
subkey = OpenKey(self.lm_hive, subkeyname)
release = QueryValueEx(subkey, 'Release')[0]
return release
except Exception as e:
print (e)
然后使用它:
a = look_get_DotNet_version(machine)
d="460805"
b = a.getdotnetinfo(subkeyname)
print(b)
print(b == d)
if b == d:
# do something
如果您坚持创建自定义类并覆盖__eq__()
,则首先需要明确定义相等性的含义。 在这种情况下,我认为如果两个实例具有相同的release
属性,则希望它们相等:
def __eq__(self, other):
return self.release == other.release
无需对此进行过多思考。
确保使用==
运算符。 您永远不要直接调用__eq__()
:
a = look_get_DotNet_version(machine)
d = DotNetVersion("460805")
b = a.getdotnetinfo(subkeyname)
print(b)
print(b == d)
if b == d:
# do something
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.