区分python对象是否是当前_uinit__;方法的子类

区分python对象是否是当前_uinit__;方法的子类,python,init,Python,Init,这是一个奇怪的问题。我曾经遇到过这样的情况,我想在python对象的\uuu init\uuu末尾执行一些操作。我只想在true类(leaf类)的\uuuu init\uuuu中做最后一件事。如果在self\uuuu init\uuuu方法的超类中,我绝对不想这样做。有什么好办法吗?我承认这样做可能是愚蠢的。但这让我好奇,这是否以及如何才能做到 如果您想在叶类中运行一些代码,在\uuuuu init\uuuuu的末尾,没有它在基类中运行……只需重写叶类中的\uuuuuuu init\uuuuu。

这是一个奇怪的问题。我曾经遇到过这样的情况,我想在python对象的
\uuu init\uuu
末尾执行一些操作。我只想在true类(leaf类)的
\uuuu init\uuuu
中做最后一件事。如果在self
\uuuu init\uuuu
方法的超类中,我绝对不想这样做。有什么好办法吗?我承认这样做可能是愚蠢的。但这让我好奇,这是否以及如何才能做到

如果您想在叶类中运行一些代码,在
\uuuuu init\uuuuu
的末尾,没有它在基类中运行……只需重写叶类中的
\uuuuuuu init\uuuuu
。例如:

class Base(object):
    def __init__(self):
        print('Base initializing')
class Intermediate(Base):
    pass
class Leaf(Intermediate):
    def __init__(self):
        super(Leaf, self).__init__()
        print('Leaf initializing')

>>> o = Base()
Base initializing
>>> o = Intermediate()
Base initializing
>>> o = Leaf()
Base initializing
Leaf initializing
class Base(object):
    def __init__(self):
        if type(self) != Base:
            print('Some subclass of Base initializing')
class Leaf(Base):
    pass

>>> obj = Leaf()
Some subclass of Base initializing

如果您试图通过编程从
Base.\uuu init\uuu
之类的方法中检测
self
Base
还是
Base
的某个子类……通常这是一个坏主意,您实际上想要使用方法重写,如上所述。但这很容易做到。例如:

class Base(object):
    def __init__(self):
        print('Base initializing')
class Intermediate(Base):
    pass
class Leaf(Intermediate):
    def __init__(self):
        super(Leaf, self).__init__()
        print('Leaf initializing')

>>> o = Base()
Base initializing
>>> o = Intermediate()
Base initializing
>>> o = Leaf()
Base initializing
Leaf initializing
class Base(object):
    def __init__(self):
        if type(self) != Base:
            print('Some subclass of Base initializing')
class Leaf(Base):
    pass

>>> obj = Leaf()
Some subclass of Base initializing
(如果您担心有人可能会破坏您的层次结构,以致于某个既不是
也不是其子类的对象可能会最终调用
基。uuuu init_uuu
,并且您确信这将是一件邪恶的事情,而不是一件聪明的monkeypatching事情,那么您可以始终检查
IsubClass



如果您试图以编程方式在
Base.\uuuu init\uuuu
之类的方法中检测Base是否为“真实类”…那么,您需要定义这意味着什么。它是否意味着“不是PEP3119意义上的抽象基类”?“尚未定义子类”?“有一些关键方法的实现”?无论你想做什么都可能是可行的,但有些会比其他人更难。(例如,要检测是否有人对您的类进行了子类化,您可能需要构建一个自定义元类。)

如果您想在叶类中运行一些代码,在
\uuuuu init\uuuuu
的末尾,如果基类中没有运行它,只需覆盖叶类中的
\uuu init\uuuuu
。例如:

class Base(object):
    def __init__(self):
        print('Base initializing')
class Intermediate(Base):
    pass
class Leaf(Intermediate):
    def __init__(self):
        super(Leaf, self).__init__()
        print('Leaf initializing')

>>> o = Base()
Base initializing
>>> o = Intermediate()
Base initializing
>>> o = Leaf()
Base initializing
Leaf initializing
class Base(object):
    def __init__(self):
        if type(self) != Base:
            print('Some subclass of Base initializing')
class Leaf(Base):
    pass

>>> obj = Leaf()
Some subclass of Base initializing

如果您试图通过编程从
Base.\uuu init\uuu
之类的方法中检测
self
Base
还是
Base
的某个子类……通常这是一个坏主意,您实际上想要使用方法重写,如上所述。但这很容易做到。例如:

class Base(object):
    def __init__(self):
        print('Base initializing')
class Intermediate(Base):
    pass
class Leaf(Intermediate):
    def __init__(self):
        super(Leaf, self).__init__()
        print('Leaf initializing')

>>> o = Base()
Base initializing
>>> o = Intermediate()
Base initializing
>>> o = Leaf()
Base initializing
Leaf initializing
class Base(object):
    def __init__(self):
        if type(self) != Base:
            print('Some subclass of Base initializing')
class Leaf(Base):
    pass

>>> obj = Leaf()
Some subclass of Base initializing
(如果您担心有人可能会破坏您的层次结构,以致于某个既不是
也不是其子类的对象可能会最终调用
基。uuuu init_uuu
,并且您确信这将是一件邪恶的事情,而不是一件聪明的monkeypatching事情,那么您可以始终检查
IsubClass



如果您试图以编程方式在
Base.\uuuu init\uuuu
之类的方法中检测Base是否为“真实类”…那么,您需要定义这意味着什么。它是否意味着“不是PEP3119意义上的抽象基类”?“尚未定义子类”?“有一些关键方法的实现”?无论你想做什么都可能是可行的,但有些会比其他人更难。(例如,要检测是否有人对您的类进行了子类化,您可能需要构建一个自定义元类。)

我不理解您的问题。你试过什么?你是说你希望每个叶类都能做超类的事情,然后再做自己的事情(而不是为超类的实例做自己的事情)?或者,您是否试图通过编程来检测一个类是否是叶类,这样您就可以有一个方法在这两种情况下执行不同的操作?或者…?眼前的例子是一个ORM想要自动存储PersistentObject子类的新实例。我知道有[许多]其他方法可以使这个特定的用例工作,但我很好奇一个可能的解决方案,它可以在init本身进行区分。我不理解你的问题。你试过什么?你是说你希望每个叶类都能做超类的事情,然后再做自己的事情(而不是为超类的实例做自己的事情)?或者,您是否试图通过编程来检测一个类是否是叶类,这样您就可以有一个方法在这两种情况下执行不同的操作?或者…?眼前的例子是一个ORM想要自动存储PersistentObject子类的新实例。我知道有[许多]其他方法可以使这个特定的用例工作,但我很好奇有一种可能的解决方案可以在init本身进行区分。显然,“邪恶”和“聪明的monkeypatching”之间的区别是很好的…@DanielRoseman:在Python中试图阻止对代码的邪恶滥用是毫无意义的,但是很多新手还是会问一些方法,所以…我让他们用自己的方式来定义邪恶。当然,他们自己的方式是错误的,因为你可以通过猴子是住在一个秘密的火山巢穴里,还是住在一个有一个戴着黄色帽子的主管道的公寓里来判断,但随着他们对Python的更加熟悉,他们会了解到这一点。我希望有一些东西比放if self更丑陋。。萨曼塔特金斯:正如我在回答中所说,“通常这是一个坏主意,你实际上想使用方法重写”。在Python中,通常是坏主意的事情往往是丑陋的,有时是故意的。如果你真的想,你可以把丑陋隐藏在一个元类或一个方法或类装饰器中,它的优点是可以分解出来,所以你也只需要做一次,但是如果这是你想要的,你必须在某个地方做(或者做一些更难看的事情,比如
sys.getframe
,或者更难以捉摸的事情,比如默认的标志参数)。谢谢。我还没有想出如何解决这个问题的最小元类解决方案,但我正朝那个方向努力。为了使用