Calling a class method upon creation of Python classes
Asked Answered
L

2

14

I'd like to automatically run some code upon class creation that can call other class methods. I have not found a way of doing so from within the class declaration itself and end up creating a @classmethod called __clsinit__ and call it from the defining scope immediately after the class declaration. Is there a method I can define such that it will get automatically called after the class object is created?

Leralerch answered 24/8, 2012 at 19:13 Comment(3)
Class creation or instance creation? Because both can be done, but the answer is different depending.Meaning
You can use metaclasses for this. See for instance this question.Degression
Aside: Please don't make up __special_methods__. That's reserved for the Python language. Use a _single_underscore_prefix if you want it to be private.Onaonager
R
21

You can do this with a metaclass or a class decorator.

A class decorator (since 2.6) is probably easier to understand:

def call_clsinit(cls):
    cls._clsinit()
    return cls

@call_clsinit
class MyClass:
    @classmethod
    def _clsinit(cls):
        print "MyClass._clsinit()"

Metaclasses are more powerful; they can call code and modify the ingredients of the class before it is created as well as afterwards (also, they can be inherited):

def call_clsinit(*args, **kwargs):
    cls = type(*args, **kwargs)
    cls._clsinit()
    return cls;

class MyClass(object):
    __metaclass__ = call_clsinit

    @classmethod
    def _clsinit(cls):
        print "MyClass._clsinit()"
Rosin answered 24/8, 2012 at 19:17 Comment(1)
I'd add that at least from the text of the question, it's hard to tell why __new__ or __init__ don't do the trick.Meaning
J
0

Since Python 3.6 there is __init_subclass__ as defined in PEP 487.

Judaist answered 2/6, 2023 at 10:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.