|
| 1 | +# 类变量、实例变量、类方法 实例方法 静态方法 |
| 2 | +## 类变量 |
| 3 | +类的所有实例之间共享的值,它们不是单独分配给每个实例的。 |
| 4 | + |
| 5 | +## 实例变量 |
| 6 | +实例化之后,每个实例对象单独拥有的变量。 |
| 7 | +```python |
| 8 | +class Test: |
| 9 | + nums_of_instance = 0 # 类变量 |
| 10 | + |
| 11 | + def __init__(self, name): |
| 12 | + self.name = name # 实例变量 |
| 13 | + Test.nums_of_instance += 1 |
| 14 | + |
| 15 | + |
| 16 | +if __name__ == '__main__': |
| 17 | + t1 = Test('实例1') |
| 18 | + t2 = Test('实例2') |
| 19 | + print(Test.nums_of_instance) # 2 |
| 20 | + print(t1.name) # 实例1 |
| 21 | + print(t2.name) # 实例2 |
| 22 | +``` |
| 23 | + |
| 24 | +## 实例方法 |
| 25 | +类中定义的普通方法,第一个参数是self(约定好的),指的是实例对象本身,通过self来传递实例对象的属性和方法。**实例方法只能由实例对象调用。** |
| 26 | + |
| 27 | +## 类方法 |
| 28 | +使用装饰器@classmethod定义,第一个参数cls,表示当前类,用cls来传递类的属性和方法。**类方法可以通过实例对象调用,也可以直接通过类名调用**, 类方法主要应用在统一修改类变量,也就是这个类下所有实例的属性。 |
| 29 | + |
| 30 | +```python |
| 31 | +class Goods: |
| 32 | + __discount = 1 # 类变量,私有,不允许外部直接访问 |
| 33 | + |
| 34 | + def __init__(self, name, price): |
| 35 | + self.name = name |
| 36 | + self.__price = price # 实例变量,私有 |
| 37 | + |
| 38 | + @classmethod |
| 39 | + def get_discount(cls): |
| 40 | + return cls.__discount |
| 41 | + |
| 42 | + @classmethod |
| 43 | + def set_discount(cls, new_discount): |
| 44 | + cls.__discount = new_discount |
| 45 | + |
| 46 | + @property |
| 47 | + def price(self): |
| 48 | + return self.__price * self.__discount |
| 49 | + |
| 50 | +if __name__ == '__main__': |
| 51 | + g1 = Goods('苹果', 10) |
| 52 | + g2 = Goods('香蕉', 15) |
| 53 | + print('全场商品折扣:{}'.format(Goods.get_discount())) |
| 54 | + print('苹果的价格:{}'.format(g1.price)) |
| 55 | + print('香蕉的价格:{}'.format(g2.price)) |
| 56 | + |
| 57 | + Goods.set_discount(0.5) # 通过类方法修改类变量 |
| 58 | + print('全场商品折扣:{}'.format(Goods.get_discount())) |
| 59 | + print('苹果的价格:{}'.format(g1.price)) |
| 60 | + print('香蕉的价格:{}'.format(g2.price)) |
| 61 | + |
| 62 | + 全场商品折扣:1 |
| 63 | + 苹果的价格:10 |
| 64 | + 香蕉的价格:15 |
| 65 | + 全场商品折扣:0.5 |
| 66 | + 苹果的价格:5.0 |
| 67 | + 香蕉的价格:7.5 |
| 68 | +``` |
| 69 | + |
| 70 | +## 静态方法 |
| 71 | +**使用装饰器@staticmethod定义,静态方法是个独立的、单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。静态方法可以通过实例对象调用,也可以通过类名调用** |
| 72 | + |
| 73 | +实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题. |
| 74 | + |
| 75 | +```python |
| 76 | +import math |
| 77 | +class Triangle(object): |
| 78 | + def __init__(self, a, b, c): |
| 79 | + self._a = a |
| 80 | + self._b = b |
| 81 | + self._c = c |
| 82 | + |
| 83 | + @staticmethod |
| 84 | + def is_valid(a,b,c): |
| 85 | + return a+b>c and a+c>b and b+c>a |
| 86 | + |
| 87 | + def d(self): |
| 88 | + return self._a + self._b + self._c |
| 89 | + |
| 90 | +if __name__ == '__main__': |
| 91 | + a,b,c = 3,4,5 |
| 92 | + if Triangle.is_valid(a,b,c): |
| 93 | + tri = Triangle(a,b,c) |
| 94 | + print('周长',tri.d()) |
| 95 | +``` |
0 commit comments