【问题标题】:How can i get all instances of class from imported model?如何从导入的模型中获取所有类的实例?
【发布时间】:2016-10-27 12:56:14
【问题描述】:

Person 是一个具有两个属性的新类:heightweight

class People:

    def __init__(self, height, weight):
        self.height = height
        self.weight = weight

我想导入另一个file.py,它具有相同的类和该类的一些对象。例如:

p1 = People(185, 87)
p2 = People(167, 73)
p3 = People(173, 90)

但我不知道每个变量如何调用以及给定文件中存在多少变量。 如何获取导入文件的所有对象? 目标是从多个文件中创建对象的 list()。

【问题讨论】:

  • 您可以查看模块中定义的所有对其他模块可见的变量,并检查它们是否为isinstance(v, People)。不过,这只会包括模块全局范围内的变量;真的有用吗?
  • 你到底想要什么?因为您尝试解决的问题听起来并不像您真正应该遇到的问题。
  • 我应该通过 assert 函数将我的类实例与其他实例进行比较,并确保它们正确实现。有某种测试程序。

标签: python class python-3.x oop


【解决方案1】:

使用inspect.getmemberspred 参数是一个很好的方法。

首先,您可以使用 inspect.isclass 获取模块中所有用户定义的类,然后创建一个新谓词来捕获您之前获得的类的任何实例。

最初,使用isclass 中定义的inspect 可以轻松获取类:

from inspect import getmembers, isclass
# the module defining the objects
import obj

# getmembers returns list of (name, val) tuples, grab vals
clses = tuple(x[1] for x in getmembers(obj, isclass))

现在,clses 是一个类元组:

print(clses) # (obj.People,)

如果类是事先知道的, 前面的步骤当然是不需要的;只需创建一个您需要查找的类的元组并继续下一步。

然后您可以创建一个新的谓词(一个简单的lambda 就足够了),它可以抓取作为clses 中任何类的实例的对象:

pred = lambda x: isinstance(x, clses)
instances = getmembers(obj, pred)

现在的结果是instances 填充了模块obj 中的任何名称,即True 用于isinstance 签入pred

print(instances)
[('p1', <obj.People at 0x7f436739ce10>),
 ('p2', <obj.People at 0x7f436739c898>),
 ('p3', <obj.People at 0x7f436739cc18>)]

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2018-12-08
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2021-08-23
    相关资源
    最近更新 更多