# python之面向对象编程
## 面向对象的编程思想
核心是"对象",对象是"容器",用来盛放数据与功能,是数据与功能的集合体,实际上就是将程序整合成一个整体
先定义类,再调用类产生对象
## 类
### 什么是类
类也是容器,该容器用来存放同类对象共有的属性和方法
### 类的定义与实例化
类是对象相似属性与方法的集合体,类体中可以包含任意代码;
类体中最常见的是变量与函数的定义。
类名推荐使用驼峰体命名法
类体代码在类定义阶段就会立即执行,会产生类的名称空间。
#### 类的定义
class Student:
# 变量的定义
stu_school = "QHUV"
# 功能函数的定义
def stu_check_info(stu_obj):
print("学生信息:姓名:%s 年龄:%s 性别:%s"%(
stu_obj["stu_name"],
stu_obj["stu_age"],
stu_obj["stu_gender"]
))
def set_info(stu_obj, x, y, z):
stu_obj["stu_name"]:x
stu_obj["stu_age"]:y
stu_obj["stu_gender"]:z
#### 类属性访问的语法
print(Student.__dict__["stu_school"])
print(Student.__dict__["stu_check_info"])
print(Student.stu_school) # 实质是Student.__dict__["stu_school"]
print(Student.stu_check_info) #实质是 Student.__dict__["stu_check_info"]
#### 实例化(调用类产生对象)
student1 = Student()
student2 = Student()
student3 = Student()
#### 为对象定制自己独有的属性
student1.stu_name = "alis" # 实质 student1.__dict__["stu_name"] = "alis"
student1.stu_age = 22 # 实质 student1.__dict__["stu_age"] = 5
student1.stu_gender = "female" # 实质 student1.__dict__["stu_gender"] = "female"
print(student1.__dict__) # 结果{'stu_name': 'alis', 'stu_age': 5, 'stu_gender': 'female'}
student2.stu_name = "Jack"
student2.stu_age = 22
student2.stu_gender = "female"
print(student2.__dict__)
student3.stu_name = "join"
student3.stu_age = 22
student3.stu_gender = "female"
print(student3.__dict__)
#### 发现的问题:
代码重复
#### 解决方法1,类的外部定义函数
def init(self, name, age, gender):
self.stu_name = name
self.stu_age = age
self.stu_gender = gender
init(student1, "爱丽丝", 11, "female")
init(student2, "杰克", 12, "male")
init(student3, "张三", 111, "male")
print(student1.__dict__)
print(student2.__dict__)
print(student3.__dict__)
#### 解决方法2(__init__()函数的使用)
class Student:
# 变量的定义
stu_school = "QHUV"
# __init__()函数会在产生对象的时候被调用,
# 其中参数self是python自动传入的一个参数,即对象本身student[i],然后在调用类的时候传入其他参数
def __init__(self, name, age, gender):
self.stu_name = name
self.stu_age = age
self.stu_gender = gender
# 功能函数的定义
def stu_check_info(self,stu_obj):
print("学生信息:姓名:%s 年龄:%s 性别:%s"%(
stu_obj["stu_name"],
stu_obj["stu_age"],
stu_obj["stu_gender"]
))
def set_info(self,stu_obj, x, y, z):
stu_obj["stu_name"]:x
stu_obj["stu_age"]:y
stu_obj["stu_gender"]:z
student1 = Student("alis", 12, "female")
print(student1.__dict__) # 结果是{'stu_name': 'alis', 'stu_age': 12, 'stu_gender': 'female'}
#### 实例化过程中发生了三件事
1. 首先产生了一个空对象
2. 会自动调用类中的__init__方法,然后将空对象以及调用类时传入的参数一同传入__init__()方法
3. 返回初始化之后的对象
#### __init__()方法
1. 会在调用类的时候自动触发执行,用来为对象初始化自己独有的数据
2. __init__()内应该放的是为对象初始化属性的功能
3. __init__()方法必须返回None
### 属性查找与绑定方法
类中存放的是对象共有的数据与功能
#### 类可以访问:
(1)类的数据属性
(2)类的函数属性
#### 类中的属性时如何给对象用的
(1)类的数据属性是共享给所有对象用的,所有对象访问的内存地址是一样的,当类的数据属性改变时,
所有对象的该属性都随之改变; 当使用对象给该属性重新赋值时,会在对象中创建一个该属性,并不会影响类中该属性的值
Student.stu_school = "qhuv" # qhuv
print(student1.stu_school) # qhuv
print(student2.stu_school) # qhuv
print(student3.stu_school) # qhuv
student1.stu_school = "qhuv"
print(student1.stu_school) # qhuv id:1853289886000
print(student2.stu_school) # QHUV id:1853282742704
print(student3.stu_school) # QHUV id:1853282742704
(2)类的函数属性
类的函数属性是绑定给对象用的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法,内存地址各不相同
类调用自己的函数属性,严格按照函数的使用方式
Student.stu_check_info(student1)
对象调用类的函数属性
绑定方法的特殊之处在于谁调用绑定方法就会将谁作为第一个参数自动传入
student1.stu_check_info()
student12.stu_check_info()
student3.stu_check_info()
python之面向对象基础
于 2022-04-17 20:51:45 首次发布