繁体   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