文章目录
0. 编程思想
三种编程思想:
(1)面向过程编程(穷人思想):会基本语法和逻辑
RIGHT Example:
s = 1
for x in range(1, 9):
s *= x
print(s)
(2)函数式编程(小资思想):会基本语法和逻辑还需要函数
RIGHT Example:
# (1)
import math
print(math.factorial(8))
# (2)
def factorial(n):
s = 1
for x in range(1, n + 1):
s *= x
return s
(3)面向对象编程(富豪思想):会基本语法和逻辑、函数还需要类和对象
1. 类和对象的概念
(1)类:类是拥有相同功能和相同属性的对象的集合(是一个抽象的概念)
(2)对象:对象是类的实例(是类的具体表现)
RIGHT Example 从生活的角度:
如果人是类,余婷就是对象、骆昊是另外一个对象
如果杯子是类,我手上的这个杯子就是对象
2. 定义类(创建类)
用代码来描述清楚这个类到底是拥有哪些相同功能和哪些相同属性的对象的集合
(1)功能:函数
(2)属性:属性(保存数据的变量)
2.1 语法
class 类名:
类的说明文档
类的内容(包括方法和属性)
(1)方法:定义在类中的函数
(2)属性:定义在类中的变量
2.2 对语法的说明
(1)class:关键字;固定写法
(2)类名:由程序员自己命名,必须符合命名要求和规范
a. 要求:是标识符;不能是关键字
b. 规范:见名知义;采用驼峰式命名(由多个单词组成,单词间通过首字母大写来区分),第一个字母大写;不使用系统的函数名、类名或者模块名
(3)类的说明文档:本质就是多行注释
(4)类的内容:由方法和属性组成
a. 方法包括:对象方法、类方法和静态方法三种
b. 属性包括:类属性(字段)和对象属性两种
RIGHT Example :
class Student:
"""
学生类
"""
pass
class Dog:
"""
狗类
"""
pass
3. 创建对象
对象是类的实例,创建对象必须通过类来创建(写在类外面)
语法:
对象 = 类名()
RIGHT Example :
# 创建两个学生类的对象
s1 = Student()
s2 = Student()
print(s1, s2)
# <__main__.Student object at 0x000001B813B688B0> <__main__.Student object at 0x000001B813B95FD0>
# 创建一个狗类的对象
dog = Dog()
print(dog)
# <__main__.Dog object at 0x000001B813B58400>
4. 方法
类中的方法分为三种:对象方法、类方法、静态方法
4.1 对象方法
(1)怎么定义:直接定义在类中的函数就是对象方法
(2)怎么调用:通过对象来调用:对象.对象方法()
(3)特点:用对象调用对象方法的时候,参数self不需要传参,系统会自动将当前对象传给self(谁去调用的这个方法当前对象就是谁)
RIGHT Example :
class A:
"""无意义的类"""
def func1(self):
print('对象方法')
print(f'self:{self}')
# self:<__main__.A object at 0x000002501E6960A0>
# 创建A的对象
a1 = A()
# 用对象调用对象方法
a1.func1()
print(f'a1:{a1}')
# a1:<__main__.A object at 0x000002501E6960A0>
4.2 类方法
(1)怎么定义:定义函数前加@classmethod装饰器
(2)怎么调用:通过类来调用:类.类方法
(3)特点:参数cls不需要传参,系统会自动将当前类传给cls
RIGHT Example :
class A:
"""无意义的类"""
@classmethod
def func2(cls):
print('类方法')
# 用类调用类方法
A.func2()
4.3 静态方法
(1)怎么定义:定义函数前加@staticmethod装饰器
(2)怎么调用:通过类来调用:类.静态方法
(3)特点:没有特点
RIGHT Example :
class A:
"""无意义的类"""
@staticmethod
def func3():
print('静态方法')
# 用类调用静态方法
A.func3()
4.4 类中函数的参数
RIGHT Example :
class B:
def func1(self, x, y=10):
print(f'x:{x}, y:{y}')
@classmethod
def func2(cls, x, *, y, z):
print(f'x:{x}, y:{y}, z:{z}')
@staticmethod
def func3(x, y):
print(x, y)
b = B()
b.func1(100)
b.func1(100, 200)
b.func1(x=100, y=200)
B.func2(10, y=20, z=30)
B.func3(10, 20)
4.5 构造函数
名字和类名一样,专门用来创建对象的函数
python中创建类的时候,系统会自动为我们创建这个类的构造函数
4.6 __ init __方法
4.6.1 调用
当通过类创建对象的时候,类中__ init __ 方法会被自动调用
(每次通过类创建对象的时候,类中的__ init __都会被自动调用)
RIGHT Example :
class Student():
def __init__(self):
print('init方法')
stu1 = Student() # init方法
stu2 = Student() # init方法
补充:魔法方法的特点
(1)方法名是__ 开头并以 __结尾
(2)魔法方法不需要程序员主动调用,在特定事件被触发后系统会自动调用
4.6.2 参数
通过类创建对象的时候需不需要参数,需要几个参数,由这个类中的__ init __ 决定(看__ init__除了self以外有没有额外的参数)
RIGHT Example :
class Dog:
def __init__(self, x, y):
print('init方法:', x, y)
dog1 = Dog(10, 20) # init方法: 10 20
dog2 = Dog(x=100, y=200) # init方法: 100 200
5. 属性
属性分为:对象属性和类属性(字段)
5.1 类属性
(1)怎么定义:直接在类中定义一个变量,这个变量就是类属性
(2)怎么使用:通过类来使用:类.类属性
(3)什么时候用:属性不会因为对象不同而不一样就将这个属性定义成类属性
RIGHT Example :
class A:
# x是类属性
x = 100
# 通过类使用类属性
print(A.x)
A.x = 200
print(A.x)
5.2 对象属性
(1)怎么定义:以’self.属性名=值’的形式定义在__ init__方法中
(2)怎么使用:通过类来使用:类.类属性
(3)什么时候用:属性会因为对象不同而不一样就将这个属性定义成对象属性
RIGHT Example :
class A:
# y是对象属性
def __init__(self):
self.y = 200
# 通过对象使用对象属性
a = A()
print(a.y)
a.y = 300
print(a.y)
5.3 案例
APPLICATION 圆类 :
class Circle:
pi = 3.1415926
def __init__(self):
self.r = 0
圆类就是用来解决所有和圆有关的函数的集合,如算周长、算面积等
对象方法就是计算周长、面积的函数
类属性就是这些函数共同的常数项,如π
对象属性就是每个圆的属性,如半径、直径等
5.4 __ init__方法的扩展
(1)如果类需要对象属性,就需要在类中添加__ init__
(2)可以通过在__ init__中添加参数来实现创建对象的时候直接给属性赋值的目的
RIGHT Example :
class Student:
def __init__(self, name, gender='男'):
self.name = name
self.gender = gender
self.age = 0
stu1 = Student('小花', '女')
stu2 = Student('张三')
print(stu1.name, stu1.gender) # 小花 女
print(stu2.name, stu2.gender) # 张三 男
6. 方法的选择
如果实现函数的功能需要对象(对象属性)就用对象方法;如果需要类就用类方法;如果都不需要就用静态方法
APPLICATION 1 矩形类 :
class Rect:
def __init__(self, width=0, lenth=0):
self.lenth = lenth
self.width = width
# 在实现对象方法的功能的时候如果需要的数据是对象相关数据,那么这个数据就由self来提供
def area(self):
# self = r2
return self.width * self.lenth
r1 = Rect(10, 20)
r2 = Rect(5, 8)
print(r2.area())
APPLICATION 2 矩形类 :
class Circle:
pi = 3.14
def __init__(self, r):
self.r = r
def area(self):
# 这个类的对象能做的事情,self都可以做
return f'{Circle.pi * self.r * self.r:.2f}'
def perimeter(self):
return f"{2 * Circle.pi * self.r:.2f}"
c1 = Circle(2)
c2 = Circle(5)
print(c1.area(), c1.perimeter()) # 12.56 12.56
print(c2.area(), c2.perimeter()) # 78.50 31.40
7. 继承
7.1 继承的概念
让子类直接拥有父类的属性和方法
子类:继承者
父类:被继承者
关系:父类拥有的东西,子类都有,但是子类除了有父类的东西以外还有一些额外特有的东西
子类是可以继承父类所有的内容(包括:类属性、对象属性、对象方法、类方法、静态方法)
RIGHT Example :
人(父类) -> 学生(子类、分类)
7.2 语法
class 类名(父类):
说明文档
类的内容
RIGHT Example :
class Person:
def __init__(self):
self.name = '小明'
self.age = 18
self.gender = '男'
def eat(self):
print('吃饭')
def sleep(self):
print('睡觉')
class Student(Person):
def study(self):
print('学习')
s1 = Student()
print(s1.name, s1.age, s1.gender) # 小明 18 男
7.3 在子类中添加内容
7.3.1 添加类属性和方法
直接在子类中定义新的类属性和新的方法
RIGHT Example :
class Person:
def __init__(self):
self.name = '小明'
self.age = 18
self.gender = '男'
def eat(self):
print('吃饭')
def sleep(self):
print('睡觉')
class Teacher(Person):
profession = '老师'
def teach(self):
print('上课')
t1 = Teacher()
print(Teacher.profession) # 老师
t1.teach() # 上课
t1.eat() # 吃饭
7.3.2 添加对象属性
需要在子类的__ init__ 方法中通过super()去调用父类的__ init__方法来继承父类的对象属性
WRONG Example :
class Person:
def __init__(self):
self.name = '小明'
self.age = 18
self.gender = '男'
def eat(self):
print('吃饭')
def sleep(self):
print('睡觉')
class Teacher(Person):
profession = '老师'
# 子类中不能直接加对象属性
def __init__(self):
self.title = '副教授'
def teach(self):
print('上课')
t1 = Teacher()
print(t1.name, t1.gender, t1.age)
# 报错,AttributeError: 'Teacher' object has no attribute 'name'
RIGHT Example :
class Person:
def __init__(self):
print('Person的__init__方法') # Person的__init__方法
self.name = '小明'
self.age = 18
self.gender = '男'
def eat(self):
print('吃饭')
def sleep(self):
print('睡觉')
class Teacher(Person):
profession = '老师'
def __init__(self):
# 主动调用父类的__init__方法去继承父类的对象属性
# super():获取当前类的父类对象
super().__init__()
print('Teacher的__init__方法') # Teacher的__init__方法
self.title = '副教授'
def teach(self):
print('上课')
t1 = Teacher()
print(t1.name, t1.gender, t1.age, t1.title) # 小明 男 18 副教授
补充:用__ repr__定制打印结果
RIGHT Example :
class Person:
def __init__(self, name, age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
class Student(Person):
def __init__(self, study_id, name, age=12, gender='男'):
super().__init__(name, age, gender)
self.study_id = study_id
# 打印当前类的对象的时候就会自动调用这个方法,打印的是谁,self就是谁。打印结果就是这个函数的返回值(必须是字符串)
def __repr__(self):
return str(self.__dict__)
stu1 = Student('stu001', '雪雪')
print(stu1)
# {'name': '雪雪', 'age': 12, 'gender': '男', 'study_id': 'stu001'}