- 报错的写法
class Complex:
# 写法出错
ZERO = Complex(0, 0)
ONE = Complex(1, 0)
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)
@classmethod
def value_of(cls, real, imag):
return cls(real, imag)
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)
- 想copy的Java写法
public final class Complex {
public static final Complex ZERO = new Complex(0, 0)
public static final Complex ONE = new Complex(1, 0)
public Complex(double real, double imag) {
this.real = real;
this.imag = imag;
}
private final double real;
private final double imag;
}
- 更好地进行数据管理( 使用class )
问题
- python可变通的写法(假设最大程度上贴合java代码的本意)
首先。。。Python和Java不一样,是解释性的语言,走到哪儿,才会有什么东西。Python在开始定义你写的Complex类时,还并没有完成Complex类,所以不能实例化。
所以那就延后定义吧。。。比如在生成第一个对象之前,用简单的装饰器吧。
这样就是Python的‘类变量‘了。不过Python没有严格的private属性(虽然Java也可以反射访问==)
另外,用元类也可以,算是高级的装饰器
或者最简单的,在第一次实例化的时候检测,但是代码就比较难看了。处理递归之类的。。。