Наиболее очевидным способом может быть изменение объекта класса после факта:
class Vector3(object):
# ...
Vector3.zero = Vector3(0, 0, 0)
Основная проблема в этом состоит в том, что существует только один нулевой объект, и, если он изменчив, вы можете повредить его повсюду. Возможно, будет проще (и будет казаться менее хакерским) использовать динамический дескриптор, который создает нулевой вектор при каждом обращении к нему (это делается путем создания ClassProperty class):
class ClassProperty(property):
def __get__(self, cls, owner):
return self.fget.__get__(None, owner)()
class Vector3(object):
@ClassProperty
@classmethod
def zero(cls):
return cls(0, 0, 0)
Хотя я не считаю ни один из этих действительно "питоническими". Рассмотрим другие математические типы в Python: целые числа, числа с плавающей запятой и комплексные числа. Ни у одного из них нет нулевого атрибута класса или нулевого конструктора, вместо этого они возвращают ноль при вызове без аргументов. Так что, возможно, лучше всего сделать так:
class Vector3(object):
def __init__(self, x=0, y=0, z=0):
self.x = x
self.y = y
self.z = z
Это меньше похоже на Unity3D и больше похоже на Python, если вы понимаете, о чем я.