Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.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
在Python2.7中,如何找到只在子类中定义的方法?_Python_Python 2.7_Methods_Subclass - Fatal编程技术网

在Python2.7中,如何找到只在子类中定义的方法?

在Python2.7中,如何找到只在子类中定义的方法?,python,python-2.7,methods,subclass,Python,Python 2.7,Methods,Subclass,是否有一种干净的方法来获取只在父类中未定义的子类中定义的方法 class Parent(object): def method_of_parent(self): pass class SubClass(Parent): def method_of_subclass(self): pass # desired: >>> print(get_subclass_methods(SubClass)) ['method_of_su

是否有一种干净的方法来获取只在父类中未定义的子类中定义的方法

class Parent(object):
     def method_of_parent(self):
         pass
class SubClass(Parent):
     def method_of_subclass(self):
         pass

# desired:
>>> print(get_subclass_methods(SubClass))
['method_of_subclass',]

我认为有很多极端情况,但这里有一个解决方案

import inspect


class Parent(object):
     def method_of_parent(self):
         pass
class SubClass(Parent):
     def method_of_subclass(self):
         pass

def get_subclass_methods(child_cls):
    parents = inspect.getmro(child_cls)[1:]
    parents_methods = set()
    for parent in parents:
        members = inspect.getmembers(parent, predicate=inspect.ismethod)
        parents_methods.update(members)

    child_methods = set(inspect.getmembers(child_cls, predicate=inspect.ismethod))

    child_only_methods = child_methods - parents_methods
    return [m[0] for m in child_only_methods]

print(get_subclass_methods(SubClass))
结果

['method_of_subclass']

您可以使用以下几种成分实现这一目标:

  • 功能
  • 集合法
  • 内置属性
类父对象(对象):
父项(自身)的定义方法:
通过
类子类(父类):
子类(self)的def方法
通过
def get_子类_方法(cls):
methods=set(dir(cls()))
unique_methods=methods.difference(*(用于cls中base的dir(base())。uuuu base_uuuu))
返回列表(唯一的方法)
打印(获取子类方法(子类))
给出:

[“子类的方法”]

这还支持多重继承,因此也可以执行以下操作:

类子类(子类):
_子类(self)的def方法_:
通过
打印(获取子类方法(子类))
将提供:

[“子类的方法”]

查看
子类。uuuu dict\uuuuuu
也包含父dict。不,它不-
映射代理({uuuu模块:''uuuuu main_uuuu','uuuuu doc':无,'uu子类的方法:})
。没有父类的
method\u
。很抱歉,我忘了提到python 2.7如果在父类上定义了一个方法,并且在子类上重写了该方法,那么它是否应该出现在列表中?