首先。。。Python和Java不一样,是解释性的语言,走到哪儿,才会有什么东西。Python在开始定义你写的Complex类时,还并没有完成Complex类,所以不能实例化。
所以那就延后定义吧。。。比如在生成第一个对象之前,用简单的装饰器吧。
def lazy(clazz):
clazz.ZERO = clazz(0, 0)
clazz.ONE = clazz(1, 0)
return clazz
@lazy
class Complex:
def __init__(self, real, imag):
self._real = real
self._imag = imag
# 改善后的写法, 但是无法在class级别进行缓存
# 而且变成了函数调用, 非我本意
def get_real(self):
return self._real
def get_imag(self):
return self._imag
def __repr__(self):
return 'Complex(%s, %s)' % (self._real, self._imag)
这样就是Python的‘类变量‘了。不过Python没有严格的private属性(虽然Java也可以反射访问==)
另外,用元类也可以,算是高级的装饰器
class Meta(type):
def __new__(cls, name, bases, attrs):
clazz = type.__new__(cls, name, bases, attrs)
clazz.ZERO = clazz(0, 0)
clazz.ONE = clazz(1, 0)
return clazz
class Complex(metaclass=Meta):
def __init__(self, real, imag):
self._real = real
self._imag = imag
# 改善后的写法, 但是无法在class级别进行缓存
# 而且变成了函数调用, 非我本意
@classmethod
def zero(cls):
return cls(0, 0)
@classmethod
def one(cls):
return cls(1, 0)
def get_real(self):
return self._real
def get_imag(self):
return self._imag
def __repr__(self):
return 'Complex(%s, %s)' % (self._real, self._imag)
或者最简单的,在第一次实例化的时候检测,但是代码就比较难看了。处理递归之类的。。。