- 类: 用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。
- 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
- 类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用。
- 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 方法:类中定义的函数。
- 实例化:创建一个类的实例,类的具体对象。
- 对象:通过类定义的数据结构实例,对象包括数据成员(类变量和实例变量)和方法。
- 继承:即一个派生类继承基类的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 多态:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写。
class Student:
course_count = 4 # 类变量
# 定义学生属性(构造函数)
def __init__(self, name, number):
self.name = name # 实例变量
self.number = number # 实例变量
# 定义方法
def show(self):
print(f’姓名: {self.name},学号: {self.number}’)# 实例化
stu1 = Student(‘当打之年’,’001′)
stu1.show()
print(f’共 {stu1.course_count} 门课程’)
# 姓名: 当打之年,学号: 001
# 共 4 门课程
stu2 = Student(‘欧K’,’002′)
stu2.show()
print(f’共 {stu2.course_count} 门课程’)
# 姓名: 欧K,学号: 002
# 共 4 门课程
1.1 创建
”’变量”’
”’方法”’
pass
class 是关键字,表示类。例如 class Student 即创建了一个 Student 类。
1.2 数据成员
数据成员包括:变量和方法。
1.2.1 变量:
self.name = name # 实例变量
self.number = number # 实例变量
1.2.2 方法:
def show(self):
print(f’姓名: {self.name},学号: {self.number}’)
初始化时的构造函数也是一种方法。
提示:
在对象的方法里面都有一个self参数, 比如__init__(self), show(self)。 这里的self是指对象本身而非类本身。
1.4 私有/公有
self.name = name # 实例变量
self.number = number # 实例变量
self.__score = score # 私有变量# 实例化
stu1 = Student(‘当打之年’,’001′,90)
print(stu1.name) # 当打之年
print(stu1.__score) # AttributeError: ‘Student’ object has no attribute ‘__score’
stu1 = Student(‘当打之年’,’001′)
stu2 = Student(‘欧K’,’002′)
实例化需要传入相应的参数。
2.2 调用
stu1 = Student(‘当打之年’,’001′)
stu1.show()
print(f’共 {stu1.course_count} 门课程’)
# 姓名: 当打之年,学号: 001
# 共 4 门课程
stu2 = Student(‘欧K’,’002′)
stu2.show()
print(f’共 {stu2.course_count} 门课程’)
# 姓名: 欧K,学号: 002
# 共 4 门课程
2.2.1 @classmethod(类方法)
print(f’共 {self.course_count} 门课程’)# 实例化
stu1 = Student(‘当打之年’,’001′)
stu1.get_course_count() # 共 4 门课程
Student.get_course_count() # TypeError: get_course_count() missing 1 required positional argument: ‘self’
def get_course_count(cls):
print(f’共 {self.course_count} 门课程’)# 实例化
stu1 = Student(‘当打之年’,’001′)
stu1.get_course_count() # 共 4 门课程
Student.get_course_count() # 共 4 门课程
这里的cls和self相似,是惯用写法,均可用其他字符代替。
2.2.2 @staticmethod(静态函数)
def student_info(a,b,c):
print(f’姓名: {a},学号: {b},共 {c} 门课程’) # 姓名: 当打之年,学号: 001,共 4 门课程
print(f’姓名: {a},学号: {b},共 {course_count} 门课程’) # 错误# 实例化
stu1 = Student(‘当打之年’,’001′)
stu1.student_info(‘当打之年’,’001′,4) # 姓名: 当打之年,学号: 001,共 4 门课程
course_count为类变量,直接访问会报错,此外静态函数参数个数没有要求,可有可无。
2.2.3 @property(伪装)
def get_student_info(self):
print(f’姓名: {self.name},学号: {self.number},共 {self.course_count} 门课程’)# 实例化
stu1 = Student(‘当打之年’,’001′)
stu1.get_student_info() # TypeError: ‘NoneType’ object is not callable
stu1.get_student_info # 姓名: 当打之年,学号: 001,共 4 门课程
class ChildClassName(FatherClassName):
”’变量”’
”’方法”’
pass# 多继承
class ChildClassName(FatherClassName1,FatherClassName2,…):
”’变量”’
”’方法”’
pass
class CollegeStudent:
print(‘我是父类’)
# 定义学生属性(构造函数)
def __init__(self, name, number):
self.name = name # 实例变量
self.number = number # 实例变量
# 定义方法
def show(self):
print(f’姓名: {self.name},学号: {self.number}’)# 创建某专业学生子类
class Student(CollegeStudent):
print(‘我是子类’)
pass# 实例化
stu1 = Student(‘当打之年’,’001′)
stu1.show() # 姓名: 当打之年,学号: 001
派生就是子类在继承父类的基础上衍生出新的属性或者方法。即子类中有,父类中没有;或子类定义与父类重名的东西。子类也叫派生类。
3.2.1 增加属性:
class Student(CollegeStudent):
def __init__(self, name, number, score):
CollegeStudent.__init__(self, name, number)
self.score = score # 实例变量
# 定义方法
def show_score(self):
print(f’姓名: {self.name},学号: {self.number},成绩: {self.score}’)# 实例化
stu1 = Student(‘当打之年’,’001′,99)
stu1.show() # 姓名: 当打之年,学号: 001
stu1.show_score() # 姓名: 当打之年,学号: 001,成绩: 99
3.2.2 方法重写:
class Student(CollegeStudent):
def __init__(self, name, number, score):
CollegeStudent.__init__(self, name, number)
self.score = score # 实例变量# 重写方法
def show(self):
print(f’姓名: {self.name},学号: {self.number},成绩: {self.score}’)# 实例化
stu1 = Student(‘当打之年’,’001′,99)
stu1.show() # 姓名: 当打之年,学号: 001,成绩: 99
class Student(CollegeStudent):
def __init__(self, name, number, score):
CollegeStudent.__init__(self, name, number)
self.score = score # 实例变量# 重写方法
def show(self):
super().show()
”’其他代码”’# 实例化
stu1 = Student(‘当打之年’,’001′,99)
stu1.show() # 姓名: 当打之年,学号: 001
class Student:
def __init__(self, name, number, score):
self.name = name # 实例变量
self.number = number # 实例变量
self.score = score # 私有变量def show(self):
print(f’学生姓名: {self.name},学号: {self.number},成绩: {self.score}’)# 创建教师类
class Teacher:
def __init__(self, name, number):
self.name = name # 实例变量
self.number = number # 实例变量def show(self):
print(f’教师姓名: {self.name},工号: {self.number}’)# 实例化学生对象
stu1 = Student(‘当打之年’,’001′,99)
stu1.show() # 学生姓名: 当打之年,学号: 001,成绩: 99
# 实例化教师对象
tec1 = Teacher(‘Python’,’t101′)
tec1.show() # 教师姓名: Python,工号: t101
4.2 运算符多态
return data1 + data2print(add(3, 5)) # 8
print(add(‘Python ‘, ‘当打之年’)) # Python 当打之年
4.3 运算符重载
class Operate:
def __init__(self, data):
self.data = data# 内置魔法函数
def __repr__(self): # 消除两边的尖括号
return f’Operate({self.data})’# 制定self + other规则
def __add__(self, other):
a = self.data + other.data
return Operate(a)# 制定self – other规则
def __sub__(self, other):
a = self.data – other.data
return Operate(a)r1 = Operate(100)
r2 = Operate(300)
r3 = r1 + r2 # Operate(400)
print(r3)
r4 = r3 – r2 # Operate(100)
所有重载方法的名称前后都有两个下划线字符,以便把同类中定义的变量名区别开来。
三大特征 :封装、继承、多态。
重点注意继承和多态,旨在提高代码的复用性以及灵活性。
转载请注明:XAMPP中文组官网 » Python面向对象一文详解实例