面向对象与类
何为面向对象
面向对象,按照字面意思就是根据对象来进行编程,实际上面向对象就是一种思维方式的转变
按照这种编程思想编程大致可分为两类,一种是面向过程编程,一种就是面向对象编程
面向过程编程
就是按照事物的发展顺序一步一步来,并且随着事物的发展问题的解决也会变得越来越简单
我们到目前为止所学习使用的几乎都是面向过程编程
面向对象编程
首先面向对象在编程中就是数据与功能的绑定,也就是功能只能给特定的数据使用
其次对象在python中可以看成是容器,用于存放数据与功能,也就是对象就是数据与功能的结合体
ps:python中一切皆对象
面向对象之类与对象
面向对象并不是一门新的技术,但是为了使用方便和很好的区分开,针对面向对象设计了新的语法格式
在python中要产生对象就必须要借助类
类的语法结构
class 类名(通常首字母大写):
对象公共的数据
对象公共的功能
1.class 是定义类的关键字
2.类名的命名与变量名几乎一致,但是为了区分开类名与变量名所以一般推荐类名首字母大写
3.数据就是变量名与数据值的绑定,功能就是函数
类的定义与调用
类在定义阶段就会执行类体代码,但这是属于类的局部名称空间,外界无法直接调用,如果需要访问数据或功能,那么可以统一采用句点符
class Student:
school_name = '老男孩'
def choice_course(self):
print('选择课程')
# 查看名称空间
print(Student.__dict__)
# {'__module__': '__main__', 'school_name': '老男孩','choice_course': <function Student.choice_course at 0x000001C2978994C0>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
# 访问数据或功能
print(Student.school_name) # 老男孩
print(Student.choice_course) # <function Student.choice_course at 0x00000195845294C0>
按照名称空间我们可以使用Student.__dict__.get()来访问数据或功能,但是这样太麻烦了,所以在面向对象中统一采用句点符来访问数据或功能
# 类的调用即产生对象
类名加括号会产生一个对象并且每执行一次都会产生一个新的对象(生孩子???)
stu1 = Student() # 生了老大
print(stu1.__dict__) # {} 老大自己个是个穷光蛋,毛都没有
print(stu1.school_name) # 老男孩 还好父母给帮忙
Student.school_name = '老小孩' # 类里面的数据值可以直接修改
print(stu1.school_name) # 老小孩
对象独有的数据和功能
除却类里面的公共数据和功能外,只能对象自己访问的数据(孩子长大了有家产了!!!)
class Student:
school_name = '老男孩'
def choice_course(self):
print('选择课程')
stu1 = Student()
stu2 = Student()
# 给每个对象添加独有的数据
# 1.先查看一下对象的名称空间
print(stu1.__dict__) # {} 是一个空字典
# 2.给对象添加数据也就是往名称空间中添加数据》》往字典中添加键值对
stu1.__dict__['name'] = 'zyg'
stu1.__dict__['age'] = '18'
print(stu1.__dict__) # {'name': 'zyg', 'age': '18'}
# 3.访问数据就可以直接使用句点符
print(stu1.name) # zyg
# 添加数据太麻烦了,优化一下吧,弄成函数
def init(stu, name, age):
stu.__dict__['name'] = name
stu.__dict__['age'] = age
init(stu1, 'zyg', 18)
print(stu1.__dict__) # {'name': 'zyg', 'age': 18}
# 新问题又来了,init这个函数谁来了都能用,但是这是只给学生用的》》把函数放到类里面
class Student:
school_name = '老男孩'
def init(stu, name, age):
stu.__dict__['name'] = name
stu.__dict__['age'] = age
def choice_course(self):
print('选择课程')
stu1 = Student()
stu2 = Student()
Student.init(stu1, 'zyg', 18)
print(stu1.__dict__) # {'name': 'zyg', 'age': 18}
# 能不能把Student.init(stu1, 'zyg', 18)这一步去掉?
class Student:
school_name = '老男孩'
def __init__(stu, name, age):
stu.__dict__['name'] = name
stu.__dict__['age'] = age
def choice_course(self):
print('选择课程')
stu1 = Student('laj', 3)
print(stu1.__dict__) # {'name': 'laj', 'age': 3}
# 函数再升级
class Student:
school_name = '老男孩'
def __init__(stu, name, age):
stu.name = name # stu.__dict__['name'] = name
stu.age = age
def choice_course(self):
print('选择课程')
stu1 = Student('laj', 3)
print(stu1.__dict__) # {'name': 'laj', 'age': 3}
这是对象独有数据的添加,那么对象独有的功能呢?
严格意义上来说对象没有自己独有的功能,它所使用的功能是定义在类里面的公共函数,只是类有一个特征:功能是公共的,结果是独有的(对象在使用功能时会将自己当做第一个参数传入)
class Student:
school_name = '老男孩'
def __init__(stu, name, age):
stu.name = name # stu.__dict__['name'] = name
stu.age = age
def choice_course(self):
print('选择课程')
Student.choice_course(123) # 选择课程
stu1.choice_course() # 选择课程
标签:__,stu1,name,age,面向对象,dict,Student
From: https://www.cnblogs.com/zyg111/p/16852521.html