[英]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.