1

假设我有这个:

from PySide2 import QtWidgets

class MyClass(object):
    def __init__(self, parent=None):
        self.class_variable = QtWidgets.QWidget()

class_instance = MyClass()
variable = class_instance.class_variable
class_instance_returned = mystery_method(variable)  # How to make this return class_instance?

我应该如何定义mystery_method以便它返回class_instance实例?

我的实际情况是,我正在发送一个QWidget用作将 .ui 文件加载到函数中的基本实例。在这个函数中,我需要弄清楚它属于哪个类实例。

4

3 回答 3

2

蟒蛇 2.7

class MyClass(object):
    def foo():
        return 'bar'

instance = MyClass()

def mystery_method(method):
    return method.im_self.__class__

print mystery_method(instance.foo)

蟒蛇 3

class MyClass(object):
    def foo():
        return 'bar'

instance = MyClass()

def mystery_method(method):
    return method.__self__.__class__

print mystery_method(instance.foo)

编辑

OP被编辑后:

class ParentClass():
    def foo():
        return 'bar'

class MyClass(object):
    def __init__(self, parent=None):
        self.instance_attribute = ParentClass()

def mystery_method(method):
    return method.__class__

class_instance = MyClass()
print mystery_method(class_instance.instance_attribute)
于 2017-04-03T09:08:48.580 回答
1

一种方法是我们定义foo一个自定义属性,当它的值被获取时返回它的值和相关的实例:

from collections import namedtuple


class Prop(object):
    def __init__(self, val):
        self.val = val

    def __get__(self, instance, type):
        return namedtuple('Prop', ('value', 'instance'))(self.val, instance)

    def __set__(self, instance, val):
        self.val = val


class MyClass(object):
    foo = Prop('bar')

现在在您的程序中,您可以分别使用's和属性显式使用其值和相关实例。foovalueinstance

演示:

>>> instance = MyClass()
>>> instance.foo
Prop(value='bar', instance=<__main__.MyClass object at 0x10effbcd0>)
>>> instance.foo.value
'bar'
>>> instance.foo.instance
<__main__.MyClass object at 0x10effbcd0>
于 2017-04-03T09:23:20.147 回答
0

一般来说,你不能(至少不是没有大量搜索系统中的所有对象),但如果你只想找到一个类的哪些实例与特定值匹配,那么它相当容易。

您可以创建一组所有实例并遍历它们以找到您需要的内容。

from weakref import WeakSet
class MyClass(object):
    _instances = WeakSet()

    def __init__(self, foo):
        self._instances.add(self)
        self.foo = foo

    @classmethod
    def findFoo(cls, foo):
        return [instance for instance in cls._instances if instance.foo == foo]


>>> instance1 = MyClass('bar')
>>> instance2 = MyClass('baz')
>>> MyClass.findFoo('baz')
[<__main__.MyClass object at 0x7f6723308f50>]
>>> MyClass.findFoo('bar')
[<__main__.MyClass object at 0x7f6723308c50>]

请注意,删除对象不会立即将其删除,可能要等到垃圾收集后才会删除:

>>> del instance1
>>> MyClass.findFoo('bar')
[<__main__.MyClass object at 0x7f6723308c50>]
>>> import gc
>>> gc.collect()
16
>>> MyClass.findFoo('bar')
[]

但是,一般来说,您最好保留对原始对象的引用并使用它。

'bar'另外,请注意,如果它存储在多个对象中,您无法可靠地判断哪个实例存在:它们可能相同'bar',也可能不同,它们是否相同或不同是实现细节。

于 2017-04-03T09:32:53.170 回答