1. 类的意义
首先,需要明白的是“类“这种语法结构存在的目的:将数据和操作数据的方法封装在一个类中,类的成员函数是类对外的接口,而这也正是面向对象语言的本质。
面向过程和面向对象
- 面向过程:以函数为中心,以函数作为划分程序的基本单位,数据往往处于从属地位。
- 面向对象:以数据为中心,以类作为数据的表现工具,类是划分程序的基本单位,函数成为类的接口。
2. 类属性和类方法
概念
下面的关系,对于理解类的思想以及结构都十分重要:
类结构 | 描述 | |
---|---|---|
属性 | 共性 | 共性——类属性——由赋值来实现 |
个性 | 个性——对象属性——使用__init__中的self参数 赋值来实现 | |
方法 | 个性 | 个性——对象属性——由函数来实现 |
例子
class My_module():
'''
country = 'China' # 类属性——共性——静态(赋值)
location = 'SH' # 类属性——共性——静态(赋值)
'''
country = 'China'
location = 'SH'
def __init__(self, name, gender):
'''
:param name: 对象属性——个性——静态(借助 self 赋值)
:param gender: 对象属性——个性——静态(借助 self 赋值)
'''
self.name = name
self.gender = gender
def say_hi(self, words):
'''
:param words: 方法——个性——动态(函数)
:return: 打印出输入的字符串
'''
print(words)
my_module = My_module("Robin", "male") # 创建My_module()类的一个对象
print(f"In {my_module.country}") # 引用类属性
print(f"This is {my_module.name}.") # 引用对象属性
my_module.say_hi("Nice to meet you sir!") # 调用方法
In China
This is Robin.
Nice to meet you sir!
封装、继承、多态
一些补充
为什么使用__init__和 self ?
上面已经解释的很清楚了,因为有些属性可能存在个体差异,所以我们需要通过self来操作对象的属性(注意不是再是“类属性”)。
补:随记
Python 中的 __init__
魔术方法如何理解?如果一个类中没有定义__init__
会怎样?
首先,__init__
方法负责初始化。初始化有什么效果,看下面的例子,为 高三6班
同学建立一个分数档案:
1、 无__init__
class Student():
class_level = h3
-
创建学生 A 并获取学生 A 的分数:
student_A = Student() student_A.score = [100, 125, 138]
score_student_A = student_A.score
-
创建学生 B 并获取学生 B 的分数:
student_B = Student() student_B.score = [121, 98, 109]
score_student_B = student_B.score
…
以上这种方式,通过添加或者修改属性的方式是有很多缺点的,第一书写麻烦,第二属性 score 被暴露了出来
2、使用__init__
进行初始化
class Student():
class_level = h3
def __init__(self, data):
self.score = data
-
创建学生 A 并获取学生 A 的分数:
student_A = Student([100, 125, 138])
score_student_A = student_A.score
-
创建学生 B 并获取学生 B 的分数:
student_B = Student([121, 98, 109])
score_student_B = student_B.score
…
重点分析下实例参数的传递过程,来理解__init__
所起的作用:
在新建学生 A 实例( Student([100, 125, 138])
)的同时,其中的参数 [100, 125, 138]
会被传给__init__函数
(可以看出来__init__
规定了传入参数的个数),而self
永远指代新建的那个实例对象。
更多类容可以参考的一系列列回答:Python中 __init__的通俗解释是什么?
查看对象的类型和属性
lst = [1, 2, 3]
-
查看对象类型:
type()
type(lst)
<class 'list'>
-
查看对象属性:
dir()
dir(lst)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']