Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从类变量(从类外部)获取类实例?_Python_Pyside_Pyside2 - Fatal编程技术网

Python 如何从类变量(从类外部)获取类实例?

Python 如何从类变量(从类外部)获取类实例?,python,pyside,pyside2,Python,Pyside,Pyside2,假设我有这个: 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 = myster

假设我有这个:

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?
我应该如何定义
summary\u方法
,以便它返回
class\u实例
实例


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

Python2.7

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

instance = MyClass()

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

print mystery_method(instance.foo)
Python 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)

一种方法是将
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')
现在,在您的程序中,您可以分别使用
foo
value
instance
属性显式地使用其值和相关实例

演示:

>>> 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>
>实例=MyClass()
>>>instance.foo
Prop(value='bar',instance=)
>>>instance.foo.value
“酒吧”
>>>instance.foo.instance
一般来说,您不能(至少在没有大量搜索系统中所有对象的情况下)但如果您只想找到与特定值匹配的类实例,那么这相当容易

您可以创建一组所有实例,并对它们进行迭代以找到所需的内容

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>]
从weakref导入WeakSet
类MyClass(对象):
_实例=弱集()
定义初始化(self,foo):
self.\u实例。添加(self)
self.foo=foo
@类方法
def findFoo(cls、foo):
返回[cls中实例的实例。\u instances if instance.foo==foo]
>>>instance1=MyClass('bar')
>>>instance2=MyClass('baz')
>>>MyClass.findFoo('baz')
[]
>>>MyClass.findFoo('bar'))
[]
请注意,删除对象不会立即将其删除,在垃圾回收之前,它可能不会运行:

>>> del instance1
>>> MyClass.findFoo('bar')
[<__main__.MyClass object at 0x7f6723308c50>]
>>> import gc
>>> gc.collect()
16
>>> MyClass.findFoo('bar')
[]
>>del实例1
>>>MyClass.findFoo('bar'))
[]
>>>导入gc
>>>gc.collect()
16
>>>MyClass.findFoo('bar'))
[]
但是,一般来说,最好保持对原始对象的引用挂起,并使用它


另外,请注意,如果某个实例存储在多个对象中,则无法可靠地判断该实例保存的是
'bar'
:它们可能是相同的
'bar'
,也可能是不同的,它们是相同的还是不同的是一个实现细节。

您想要否我不想要该类型。我想要实际的类实例。哎呀,误解了。我认为这在一般情况下是不可能的。或者说,真的……这个问题有无限可能的答案。你到底想要什么?一种方法,它返回
MyClass
的所有实例,其属性
foo
==“bar”存储在全局范围内?对不起,我意识到我在原来的帖子中犯了一个大错误。我已经将这个类定义为一个函数。我的意思是上课。。。我刚刚编辑了我的问题。
foo
应该是类级数据属性,而不是方法。嗨@fredrik!你帖子上的代码仍然有问题。看,您将
foo
设置为
\uuuu init\uuu
方法的一个局部变量,但随后您尝试将
foo
传递给
神秘方法
,就好像
foo
MyClass
的一个方法@IvanChaer是的,对不起……我完全搞砸了。我又编辑了我的问题。@fredrik,如果你只需要一个对象的类,那么你可以使用_class_。我在编辑我的答案时考虑到了这一点。请告诉我我是否理解正确。