比较不在Python中工作的类实例或对象

2024-04-28 20:08:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的第一次,我是Python新手。 我试图创建一个程序,收集.NETFramework版本的信息,然后将其与变量D460805的值进行比较,该变量是此类的一个对象

以下是采取的步骤: 创建类DotNetVersion,它可以将我在代码末尾定义的变量d的值与在我的PC上计算为460805的值a.getdotnetinfo(subkeyname)进行比较 创建类look\u get\u DotNet\u 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")

或者,如果你能帮助我指导我如何比较这种情况下的版本

这个程序的长期设想是,如果它不匹配,就下载.NETFramework 4.7并安装到机器上

非常感谢您的帮助,如果您需要任何澄清,请告诉我

我知道格式看起来很糟糕,但我会努力的


Tags: importselfgetreleaseversiondefmachineeq
1条回答
网友
1楼 · 发布于 2024-04-28 20:08:08

通过创建一个类来包装版本字符串,您将使这一过程变得非常复杂。您可以很容易地直接从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

相关问题 更多 >