簡體   English   中英

如何從類變量(從類外部)獲取類實例?

[英]How to fetch class instance from class variable (from outside the class)?

假設我有這個:

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文件加載到函數中的基本實例。 在這個函數里面,我需要弄清楚它屬於哪個類實例。

Python 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)

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')

現在,在您的程序中,您可以分別使用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>

一般情況下你不能(至少沒有很多搜索系統中的所有對象),但如果你想要的只是找到一個類的哪個實例匹配一個特定的值,那么它就相當容易了。

您可以創建一組所有實例並迭代它們以查找所需內容。

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' ,也可以是不同的,並且它們是相同還是不同是實現詳情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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