面向对象编程
1.编程思想
-
面向过程编程:穷人思想(基本语法、 分支、循环、逻辑思维)
-
函数式编程:小资思想(基本语法、分支、循环、逻辑思维、函数)
-
面相对象编程:富豪思想(基本语法、分支、循环、逻辑思维、函数、类、对象)
2.什么是类、什么是对象
-
类:具有相同功能和相同属性的对象的集合
-
对象:对象就是类的实例。(是某一 类事物的具体表现)
3.定义类(创建类)
- 定义类:用代码来描述这个类拥有哪些相同属性和哪些相同功能的集合
数值相关共同特点用属性来描述
- 属性就是定义在类的变量
非数值相关的共同特点使用方法来描述
- 方法就是定义在类中的函数
语法:
'''
class 类名:
类的说明文档
类的内容
'''
说明:
(1)class:关键字,固定写法
(2)类名:由程序员自己命名,满足命名要求,
- 三个规范:首字母大写,驼峰式命名,见名知义;不使用系统函数、类、模块名
(3):固定的写法
(4)类的说明文档:多行注释
(5)类的内容:在这用代码来描述这个类相同的功能和属性有哪些
- 主要包含属性:对象属性、类属性和方法:对象方法、类方法、静态方法
4.创建类的对象
语法:类名+():创建指定类的对象并返回
(1)对象方法
定义:直接定义在类中的函数就是对象方法
调用:以对象.xxx()的方式来调用 :通过调用类
特点:通过对象来调用对象方法的时候默认参数self不需要传参,系统会自动将当前对象传给self (self是谁调用就指向谁)
(2)类方法
定义:需要在定义函数前加@classmatethod
调用:以类.xxx()的方式来调用
特点:通过类来调用类方法的时候默认参数cLs不用传参,系统会自动将当前类传给cls
(3)静态方法
定义:直接定义在类中的函数就是对象方法
调用:以类.xxx()的方式来调用
特点:没有特点
简单案例:
class A:
def fun(self):
print("对象方法")
@classmethod
def fun1(cls):
print("类方法")
@staticmethod
def fun2():
print("静态方法")
# 调用对象方法
a = A()
a.fun()
# 那如果我使用类调用情况怎么样呢:答案:不能通过类来调用对象方法,如果硬是要调用,需要再传参
# A.fun()#报错:fun() missing 1 required positional argument: 'self'
A.fun(A())#因此还需要传入参数
# 调用类方法,类调用类方法
A.fun1()
a.fun1()#实际上对象调用也可以,但是某些方法会缺失,所以为确保万无一失,尽量不用
# 调用静态方法,类调用静态方法
A.fun2()
a.fun2()#实际上对象调用也可以,但是某些方法会缺失,所以为确保万无一失,尽量不用
初始化方法
1.魔法方法
定义:方法名由两个下划线开头并且由两个下划线结尾,并且会在特定情况下自动调用的方法就是魔法方法
2.常见的两种魔法方法
(1)def _init_(self):当通过类创建对象的时候,类中的__ init__ 方法会被自动调用
(a)在类中添加__ init__方法的时候,可以根据需要在方法中随意添加参数。
class S:
def __init__(self):
print('__init__被调用')
S() #__init__被调用
(b)___init__方法中添加了额外的参数,那么在创建这个类的对象的时候必须通过类名后面的括号来给__ init__方法提供额外的实参
class s:
def __init__(self,w,y):
print('__init__被调用',w,y)
s(2,3) #__init__被调用 2 3
(2)__repr__(self)
a.打印类的对象的时候会自动调用__ repr__ 方法, 并且将这个方法的返回值作为这次打印的打印结果
b.这个方法的返回值必须是字符串,__repr__(self):方法中的self指向的当前的打印对象)
class s:
def __repr__(self):
return '__repr__被调用'
print(s())#__repr__被调用
属性
定义:定义在类中的变量
(1)类属性
怎么定义:直接定义在类中的变量
怎么使用:以类.xxx的方式来使用:通过类来使用类属性
class X:
#类属性
x= 12
m = 'qw'
print(X.m)#qw
print(X.x)#12
什么时候用:属性值不会因为对象不一样而不一样,定义为类属性,一般使用场景不多
(2)对象属性
怎么定义:以self.属性名 = 值的形式定义在__init__方法中
怎么使用:以对象.xxx的方式来使用:通过类来使用对象属性
class Y:
#对象属性
def __init__(self):
self.y = 1212
self.k = 156
a = Y()
print(a.y)#1212
print(a.k)#156
什么时候用:属性值会因为对象不一样而不一样,定有对象属性
class F:
def __init__(self):
# 1)直接用一个具体的数据给对象属性赋值
self.r = 5
# 2)用一个没有默认值的参数给对象属性赋值
# self.r = r
# 3)用一个有默认值的参数给对象属性赋值
# self.r = r
# 方法1
f = F()
print(f.r)#5
f.r = 20
print(f.r)#20
注意:如果实现函数的功能需要对象属性,那么这个函数必须定义成对象方法,并且在方法中通过self来提供你所需要的对象属性
继承
语法:
'''
语法:
class类名(父类1,父类2....):
说明文档
类的内容
注意:如果定义类的时候没有写继承关系,那么这个类默认继承object(基类); (cLass 类名: == cLass 类名(object):)
'''
案例:继承父类并有自己的功能
class father:
def __init__(self,name='张三',age='56'):
self.name = name
self.age = age
def fun(self):
return f'{self.name}{self.age}岁'
class son(father):
def fun_son(self):
return 'son方法'
def __init__(self):
super().__init__()
self.name = '王五'
self.age = 13
def fun_son1(self):
return f'{self.name}{self.age}岁'
s = son()
print(s.fun_son1())#王五13岁