类方法,实例方法,
类方法必须要有一个cls参数作为方法本身,不能获得类的示例属性
class Person(object): __count = 0 def __init__(self,name): self.name=name Person.__count=Person.__count+1 @classmethod def how_many(cls): return cls.name #error return cls.__count def get_count(self): return self.__count print Person.how_many() p1 = Person('Bob') p1.count=2 print Person.how_many()
一个实例会先寻找自己的属性,然后再寻找类属性,如上述代码,p1.get_count()会返回1,因为会先找自己的__count属性,没有后再找到类属性Person.__count,
Person.__count=Person.__count+1,改为 self.__count=self.__count+1,那么Person.how_many()不会变,但p1.get_count()会变成1
而如果将
实例方法貌似不能拥有递归:
def __init__(self, p, q): self.p = p self.q = q def gcd(self,p1,q1): if q1==0: return p1 return gcd(self,q1,p1%q1) #error def __add__(self, r): return Rational(self.p * r.q + self.q * r.p, self.q * r.q) def __sub__(self, r): return Rational(self.p*r.q-self.q*r.p,self.q*r.q) def __mul__(self, r): return Rational(self.p*r.p,self.q*r.q) def __div__(self, r): return Rational(self.p*r.q,self.q*r.p) def __str__(self): return '%s/%s' %(self.p,self.q) __repr__ = __str__ r1 = Rational(1, 2) a=r1.gcd(4,1) print a r2 = Rational(1, 4) print r1 + r2 print r1 - r2 print r1 * r2 print r1 / r2