Skip to content

Commit ab67b98

Browse files
committed
doc: 添加类文档
1 parent 4efde3e commit ab67b98

3 files changed

Lines changed: 223 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
- [OS](./os.md)
4949
- [错误与异常](./execptions.md)
5050
- [内置函数](./built-in-functions.md)
51+
- [](./class.md)
5152

5253
## Reference
5354

class.md

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
#
2+
3+
> 示例:example/day07
4+
5+
## 类定义
6+
7+
```py
8+
class ClassName(SuperClass,...) :
9+
...
10+
```
11+
12+
- `__init__()` 的特殊方法(构造方法)
13+
- `self` 参数,`类方法` 与普通的函数只有一个 `区别`,类方法 `必须` 有一个额外的 `第一个参数` 名称即 `self``self` 不是关键字可以自定义
14+
- 子类可以覆写父类方法,与其他语言一样。继承多个父类是,如果有多个同名方法,则 *根据继承顺序,**取先继承的类** 中方法* ,如下多继承中的 `Sample.speak` ,就使用的是第一个继承的类 `Speaker` 中的方法.
15+
16+
```py
17+
class People:
18+
# 定义基本属性
19+
name = ''
20+
age = 0
21+
# 定义私有属性,私有属性在类外部无法直接进行访问
22+
__weight = 0
23+
# 定义构造方法
24+
25+
def __init__(self, n, a, w):
26+
self.name = n
27+
self.age = a
28+
self.__weight = w
29+
30+
def speak(self):
31+
print("%s 说: 我 %d 岁。" % (self.name, self.age))
32+
33+
34+
# 实例化类
35+
p = People('runoob', 10, 30)
36+
p.speak()
37+
```
38+
39+
> 类实例化直接 `Class(*args)`
40+
> 属性引用使用 `instance.name` 的方式
41+
42+
## 类继承
43+
44+
- 单继承
45+
46+
```py
47+
# 单继承示例
48+
class Student(People):
49+
grade = ''
50+
51+
def __init__(self, n, a, w, g):
52+
# 调用父类的构函
53+
People.__init__(self, n, a, w)
54+
self.grade = g
55+
# 覆写父类的方法
56+
57+
def speak(self):
58+
print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))
59+
60+
61+
s = Student('ken', 10, 60, 3)
62+
s.speak()
63+
```
64+
65+
- 多继承
66+
67+
```py
68+
class Speaker():
69+
topic = ''
70+
name = ''
71+
72+
def __init__(self, n, t):
73+
self.name = n
74+
self.topic = t
75+
76+
def speak(self):
77+
print("我叫 %s,我是一个演说家,我演讲的主题是 %s" % (self.name, self.topic))
78+
79+
80+
# 多重继承
81+
class Sample(Speaker, Student):
82+
a = ''
83+
84+
def __init__(self, n, a, w, g, t):
85+
Student.__init__(self, n, a, w, g)
86+
Speaker.__init__(self, n, t)
87+
88+
89+
test = Sample("Tim", 25, 80, 4, "Python")
90+
test.speak() # 方法名同,默认调用的是在括号中排前地父类的方法
91+
```
92+
93+
### 属性检测
94+
95+
- `getattr(instance, name[, default])` : 访问对象的属性。
96+
- `hasattr(instance,name)` : 检查是否存在一个属性。
97+
- `setattr(instance,name,value)` : 设置一个属性。如果属性不存在,会创建一个新属性。
98+
- `delattr(instance, name)` : 删除属性。
99+
100+
### 内置 `` 属性
101+
102+
- `__dict__` : 类的属性(包含一个字典,由类的数据属性组成)
103+
- `__doc__` :类的文档字符串
104+
- `__name__`: 类名
105+
- `__module__`: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
106+
- `__bases__` : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
107+
108+
## 类检测
109+
110+
- `issubclass()` 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
111+
- `isinstance(obj, Class)` 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。
112+
113+
## 类属性与方法
114+
115+
- 类的私有属性
116+
117+
> `__private_attrs``两个下划线开头`,声明该属性为`私有属性`,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
118+
119+
- 类的方法
120+
121+
> 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
122+
123+
- 类的私有方法
124+
125+
> `__private_method``两个下划线开头`,声明该方法为`私有方法`,不能在类的外部调用。在类的内部调用 self.__private_methods
126+
127+
## 单下划线、双下划线、头尾双下划线说明:
128+
129+
- `首尾双下划线``__init__()` : 定义的是特殊方法,一般是 `系统定义`
130+
- `单下划线开头``_foo` : 表示的是 `protected` 类型的变量,即保护类型只能允许其本身与子类进行访问,`不能用于 from module import *`
131+
- `双下划线开头``__foo` : 表示的是 `私有类型(private)` 的变量, 只能是允许这个类本身进行访问了
132+
133+
## 子类继承父类构造函数说明
134+
135+
- `__init__` 为构造
136+
- `子类` **不重写** `__init__`,实例化子类时,会 `自动调用` **父类** 定义的 `__init__`
137+
- 如果重写了 `__init__` 时,实例化子类,就 `不会自动调用` 父类已经定义的 `__init__`
138+
- 继承父类的构造方法,可以使用 `super` 关键字
139+
140+
```py
141+
super(子类,self).__init__(参数1,参数2....)
142+
# 或者
143+
父类名称.__init__(self,参数1,参数2...)
144+
```
145+
146+
## 参考
147+
148+
- [菜鸟 - Python3 类](http://www.runoob.com/python3/python3-class.html)
149+
- [菜鸟 - 类](http://www.runoob.com/python/python-object.html)
150+
- [菜鸟 - Python3 子类继承父类构造说明](http://www.runoob.com/w3cnote/python-extends-init.html)

example/day07/class.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env python3
2+
# -*- coding=utf-8 -*-
3+
4+
5+
class People:
6+
# 定义基本属性
7+
name = ''
8+
age = 0
9+
# 定义私有属性,私有属性在类外部无法直接进行访问
10+
__weight = 0
11+
# 定义构造方法
12+
13+
def __init__(self, n, a, w):
14+
self.name = n
15+
self.age = a
16+
self.__weight = w
17+
18+
def speak(self):
19+
print("%s 说: 我 %d 岁。" % (self.name, self.age))
20+
21+
22+
# 实例化类
23+
p = People('runoob', 10, 30)
24+
p.speak()
25+
26+
print('---------------------------')
27+
28+
# 单继承示例
29+
30+
31+
class Student(People):
32+
grade = ''
33+
34+
def __init__(self, n, a, w, g):
35+
# 调用父类的构函
36+
People.__init__(self, n, a, w)
37+
self.grade = g
38+
# 覆写父类的方法
39+
40+
def speak(self):
41+
print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))
42+
43+
44+
s = Student('ken', 10, 60, 3)
45+
s.speak()
46+
47+
print('---------------------------')
48+
49+
50+
class Speaker():
51+
topic = ''
52+
name = ''
53+
54+
def __init__(self, n, t):
55+
self.name = n
56+
self.topic = t
57+
58+
def speak(self):
59+
print("我叫 %s,我是一个演说家,我演讲的主题是 %s" % (self.name, self.topic))
60+
61+
62+
# 多重继承
63+
class Sample(Speaker, Student):
64+
a = ''
65+
66+
def __init__(self, n, a, w, g, t):
67+
Student.__init__(self, n, a, w, g)
68+
Speaker.__init__(self, n, t)
69+
70+
71+
test = Sample("Tim", 25, 80, 4, "Python")
72+
test.speak() # 方法名同,默认调用的是在括号中排前地父类的方法

0 commit comments

Comments
 (0)