簡體   English   中英

比較類實例或對象在Python中不起作用

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM