1)实例方法隐含的参数 self 为类实例,而类方法隐含的参数 cls 为类本身;
2)逻辑上类方法应当只被类调用,实例方法实例调用,静态方法两者都能调用;
3)静态方法无隐含参数,主要为了类实例也可以直接调用静态方法;
4)静态含数带有 cls 或 self 参数传递类、类实例,可对类变量或类属性进行修改;
5)实例变量是对于每个实例都独有的数据,而类变量是该类所有实例共享的属性和方法;
6)通过对类实例对类变量进行修改(通过实例方法或则带 self 参数的静态函数)后,该实例的类变量只能通过类实例进行修改,类方法修改类变量对该实例无效;
代码详解:
#!/usr/bin/python3
class Fruit:
discount = 1; # 类变量
def __init__(self, name, price, number):
self.price = price # 实例变量
self.name = name
self.count = number
def finalPrice(self):
print('%s price:%.1f count:%d' %(self.name, self.price * self.discount, self.count))
def setDiscount(self, discount, number):
self.discount = discount # 必须带self.,否则认为是新变量
self.count = number
@classmethod
def setClassDiscount(cls, discount, number):
cls.discount = discount
cls.count = number
@staticmethod
def setStaticDiscount(self, discounts, number):
# self.discount = discounts
self.setDiscount(discounts,number)
# setDiscount(discounts) # 编译器报错
# discount = discounts # 编译器不报错,但会以为discount是方法内新创建的变量
apple = Fruit('apple', 10, 200)
banana = Fruit('banana', 4, 150)
apple.finalPrice()
banana.finalPrice()
print('*************************')
apple.setDiscount(0.9, 190)
apple.finalPrice() # apple price:9.0 count:190
banana.finalPrice() # banana price:4.0 count:150
fruit1 = Fruit('fruit1', 12, 200)
fruit1.finalPrice() # fruit1 price:12.0 count:200
print('*************************')
Fruit.setClassDiscount(0.8, 180)
apple.finalPrice() # apple price:9.0 count:190
banana.finalPrice() # banana price:3.2 count:150
fruit2 = Fruit('fruit2', 12, 200)
fruit2.finalPrice() # fruit2 price:9.6 count:200
print('*************************')
Fruit.setStaticDiscount(apple, 0.5, 140)
apple.finalPrice() # apple price:5.0 count:140
banana.finalPrice() # banana price:3.2 count:150
fruit3 = Fruit('fruit3', 12, 200)
fruit3.finalPrice() # fruit3 price:9.6 count:200
print('*************************')
banana.setStaticDiscount(banana, 0.5, 120)
apple.finalPrice() # apple price:5.0 count:140
banana.finalPrice() # banana price:2.0 count:120
fruit4 = Fruit('fruit4', 12, 200)
fruit4.finalPrice() # fruit4 price:9.6 count:200
print('*************************')
Fruit.setClassDiscount(0.2, 110)
apple.finalPrice() # apple price:5.0 count:140
banana.finalPrice() # banana price:2.0 count:120
fruit5 = Fruit('fruit5', 12, 200)
fruit5.finalPrice() # fruit5 price:2.4 count:200
print('*************************')
banana.setStaticDiscount(banana, 0.1, 110)
apple.setStaticDiscount(apple, 0.1, 110)
apple.finalPrice() # apple price:1.0 count:110
banana.finalPrice() # banana price:0.4 count:110
pear = Fruit('pear', 6, 300)
pear.finalPrice() # pear price:1.2 count:300
print('*************************')
输出结果: