Skip to content

Commit 6a22e1d

Browse files
committed
类方法
类方法
1 parent f0651b0 commit 6a22e1d

2 files changed

Lines changed: 117 additions & 22 deletions

File tree

python_basic/main.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
## Python基础
2-
1. [时间格式转换](时间格式转换.md)
3-
4-
2. [字节串与十六进制转换](字节串与十六进制转换.md)
5-
3. [struct-序列化与反序列化](序列化与反序列化.md)
6-
4. [文件路径处理](文件路径处理.md)
7-
5. [创建临时文件](创建临时文件.md)
8-
6. [文件目录扫描](文件目录扫描.md)
9-
7. [XML文件处理](XML文件处理.md)
10-
8. [utf8-BOM文件处理](utf8BOM文件处理.md)
11-
9. [解析命令行参数(getopt)](解析命令行参数getopt.md)
12-
10. [等分字符串](等分字符串.md)
13-
11. [读取配置文件(configparser)](读取配置文件configparser.md)
14-
12. [集合删除元素](集合删除元素.md)
15-
13. [网络字节序(大端)与主机字节序(小端)转换](网络字节序与主机字节序转换.md)
16-
14. [文件目录事件监控](文件目录事件监控.md)
17-
15. [车牌格式校验](车牌格式校验.md)
18-
16. [关于tuple](关于tuple.md)
19-
17. [json文件处理](json文件处理.md)
20-
18. [Excel文件处理](Excel文件处理.md)
21-
19. [深拷贝与浅拷贝](深拷贝与浅拷贝.md)
22-
20. [列表推导式,字典推导式,生成器表达式,map,filter,reduce](列表推导式.md)
23-
21. [== 与 is的区别](is.md)
2+
* [时间格式转换](时间格式转换.md)
243

4+
* [字节串与十六进制转换](字节串与十六进制转换.md)
5+
* [struct-序列化与反序列化](序列化与反序列化.md)
6+
* [文件路径处理](文件路径处理.md)
7+
* [创建临时文件](创建临时文件.md)
8+
* [文件目录扫描](文件目录扫描.md)
9+
* [XML文件处理](XML文件处理.md)
10+
* [utf8-BOM文件处理](utf8BOM文件处理.md)
11+
* [解析命令行参数(getopt)](解析命令行参数getopt.md)
12+
* [等分字符串](等分字符串.md)
13+
* [读取配置文件(configparser)](读取配置文件configparser.md)
14+
* [集合删除元素](集合删除元素.md)
15+
* [网络字节序(大端)与主机字节序(小端)转换](网络字节序与主机字节序转换.md)
16+
* [文件目录事件监控](文件目录事件监控.md)
17+
* [车牌格式校验](车牌格式校验.md)
18+
* [关于tuple](关于tuple.md)
19+
* [json文件处理](json文件处理.md)
20+
* [Excel文件处理](Excel文件处理.md)
21+
* [深拷贝与浅拷贝](深拷贝与浅拷贝.md)
22+
* [列表推导式,字典推导式,生成器表达式,map,filter,reduce](列表推导式.md)
23+
* [== 与 is的区别](is.md)
24+
* [类变量、实例变量、类方法、实例方法、静态方法](类实例静态方法.md)
2525
* [总结](总结.md)
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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

Comments
 (0)