当前位置: 首页 > 面试题库 >

Python-如何查询定义方法的类?

施玉宸
2023-03-14
问题内容

我的问题与此相似。它涉及对象方法而不是模块内容。我想知道是否可以使用inspect模块来获取仅在我要询问的类中定义的方法,而不是其父类中定义的方法。

我之所以需要这样做,是因为我的子类定义了“宏”方法,该方法在更高的抽象级别访问父方法,并且我不希望用户担心在继承过程中一直定义的较低级别的方法。树。

这是一个简化的示例:

class Foo(object):
    def __init__(self): pass
    def f1(self): return 3
    def f2(self): return 1

class Bar(Foo):
    def __init__(self): Foo.__init__(self)
    def g1(self): return self.f1() + self.f2()
    def g2(self): return self.f1() - self.f2()

import inspect
inspect.getmembers(Bar, inspect.ismethod)

输出:

[('__init__', <unbound method Bar.__init__>),
 ('f1', <unbound method Bar.f1>),
 ('f2', <unbound method Bar.f2>),
 ('g1', <unbound method Bar.g1>),
 ('g2', <unbound method Bar.g2>)]

用户不必知道或关心fs的存在,因为她只会对gs感兴趣。(当然,此输出在绝大多数情况下都是有意义的,因为所有这些方法都将在实例化时绑定到该对象。)对于长继承树,返回的列表可能会很长,并且充满了与用户无关。

我怎样才能得到它的休假f1和f2关闭这个名单?__module__类中定义的方法的属性是否等效?更好的是,是否可以对实例方法执行相同的操作?


问题答案:

方法具有一个im_class属性,该属性指向所讨论的类。您可以在属于该类成员的函数上使用该过滤器

inspect.getmembers(Bar,
    lambda m: inspect.ismethod(m) and m.__func__ in m.im_class.__dict__.values())

这给您:

[
    ('__init__', <unbound method Bar.__init__>),
    ('f1', <unbound method Bar.f1>), 
    ('f2', <unbound method Bar.f2>)
]

当然,您可以完全绕开getmembers然后:

[m for m in Bar.__dict__.values() if inspect.isfunction(m)]

给出:

[<function __init__ at 0x100a28de8>, <function g1 at 0x100a28e60>, <function g2 at 0x100a28ed8>]

这适用于绑定或未绑定的方法,它们具有相同.func(或im_func,旧名称)属性。绑定和未绑定之间的区别是.__self__属性的值(未绑定时为无)。



 类似资料:
  • 查询方法的结果可以通过关键字first或者top来限制,它们可以交替使用。在top/firest后添加数字来表示返回最大的结果数。如果没有数字,则默认假定1作为结果大小。 示例10。用Top和First查询限制结果大小 User findFirstByOrderByLastnameAsc(); User findTopByOrderByAgeDesc(); Page<

  • 基础Spring Data repository内置的查询生成器机制对于创建实体仓库的约束查询是有用的,它会从方法名中去掉find…By,read…By,query…By,count…By和get…By这些前缀并解析剩下的内容.这些前缀还能包含更多的表达式例如Distinct,设置一个distinct标志并在查询中创建它,然后第一个By的动作就像一个分隔符来表明查询实际标准的开始。最基本的方式你可

  • 通过方法名,Spring Data有两种方式获得开发者的查询意图。一是直接解析方法名,二是使用@Query创建的查询。那么到底使用哪种方式呢?Spring Data有一套策略来决定创建的查询。

  • 3.4. 定义查询方法 repository 代理有两种方法去查询。一种是根据方法名或者自定义查询,可用的选项取决于实际的商店。然而,根据相应的策略来决定实际SQL的创建,让我们看看选择项吧。 3.4.1. 查询查找策略 以下策略可供查询库基础设施来解决。您可以配置策略名称空间通过 query-lookup-strategy属性的XML配置或通过queryLookupStrategy启用的属性${

  • 以下策略可用于仓库基础结构来解决查询。你可以在XML配置中的命名空间通过query-lookup-strategy属性来配置策略或者在JAVA配置中通过Enable${store}Repositories声明queryLookupStrategy属性。有些策略可能对于特别的datastores并不支持。 CREATE 从查询方法名来尝试构建一个特别的数据查询。一般的方法都是从方法名称中移除已知设定

  • 查询方法能对以JAVA 8的Stream为返回的结果进行逐步处理。而不是简单地包装查询结果在被用来执行流的流数据存储特定的方法。 示例11。以JAVA 8的Stream来进行查询的流处理结果 @Query("select u from User u") Stream<User> findAllByCustomQueryAndStream(); Stream<User>