Вы не можете создать экземпляр класса, пока этот класс фактически не будет создан, то есть после того, как тело класса будет оценено (примечание: он выполняется как обычный код Python).
То же самое относится и к вашему примеру с Java: ClassLoader создает класс Point
и затем выполняет код из полей static
.
Грубым эквивалентом загрузчика классов в Python является метакласс, поэтому вы можете сделать что-то вроде этого:
def class_with_static(name, bases, body):
static_block = body.pop("__static__", None)
klass = type(name, bases, body)
if static_block:
static_block(klass)
return klass
class Point(object):
__metaclass__ = class_with_static
def __static__(cls):
cls.ORIGIN = cls()
def __init__(self, x=0, y=0):
self.x = x
self.y = y
assert isinstance(Point.ORIGIN, Point)
assert Point.ORIGIN.x == Point.ORIGIN.y == 0
assert not hasattr(Point, "__static__")
Конечно, это будет иметь некоторые другие последствия, такие как: все подклассы Point
будут иметь собственный атрибут ORIGIN
. Так что вы, вероятно, просто хотите сделать это, как показано на рисунке:)