|
| 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) |
0 commit comments