内容概要
- 面对对象核心思路
- 编程思想
- 面向对象之类与对象
- 类与对象的创建
- 对象独有的数据(属性)
- 对象独有的功能(方法)
面对对象核心思路
我们如果没有对象的存在,我们有一些数据 我们需要查看,
例:
name = '小王'
age = 18
def get_info(name,age):
print('%S:%S' %name,age)
我们只能通过这样的方式去查看用户的信息,
这样的方法只能说很麻烦,并且我们查看用户信息需要调用 get_info函数 并且要在里里面给他传值
所以这就很麻烦
我们学了对象后,那么对象就是: # 用于存放数据与功能的容器
面对对象核心思路:# 数据和功能的结合体
编程思想
1.面向过程编程:
过程及流程,面向过程编程就是按照固定的流程解决问题
我们在编程过程中需要列举出每一步的流程 并随着步骤的深入问题的解决越来越简单
2.面向对象编程:
对象及容器,数据与功能的结合体(属性和方法的结合体) # python中一切皆对象
面向对象编程 就是要造出一个个不同的对象,把原本分散开的相关数据与功能整合到一个个的对象当中
至于该对象将来会如何发展跟程序员没关系 也无法控制
这样不仅能方便我们使用,而且可以提高程序的可扩展性
'''
上述两种编程思想没有优劣之分,我们在编程的时候需要结合实际需求去制定思想
这两种编程思想是相互交融的,只是在一些代码中的占比不同而已
'''
类与对象
我们在开篇提到了对象:
对象: # 数据与功能的结合体 (属性与方法)
类:多个相同数据与功能的对象的结合体 类主要就是为了节省代码
有了类的好处是,当我们的对象有相同的属性和相同的功能时,我们可以把对象定义成一个类,这样就可以让我们不需要重复的去定义对象
综上所述我们得知
现实中的情况应该时先有对象在有类
但是在程序中时反着来的:如果想要产生对象那么就得先定义类
类与对象的创建
1.类的语法结构
class 类名: # class为定义类的关键字
'''类体注释'''
对象公共的数据
对象公共的功能
# 类名的命名与变量名几乎一致 需要注意的时候首字母推荐大写用于区分
2.类的定义与调用
类在定义阶段就会执行类体代码,但是是属于类的局部名称空间 外界无法直接调用
我们通过实例来推演选课系统
# 需求:清华大学学生选课系统
# 定义类:
class Student:
school_name = '北京大学'
def choice_course(self):
print('学生都有选课的功能~')
# 1.查看名称空间(__dict__这个功能就可以将类的名称空间中的数据通过字典的形式展现出来):
print(Student.__dict__)
# {'__module__': '__main__', 'school_name': '北京大学', 'choice_course': <function Student.choice_course at 0x0000013A2586B4C0>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
print(Student.__dict__.get('school_name')) # 北京大学
func = Student.__dict__.get('choice_course')
func(1) # 我们在定义对象时候公共功能里面默认填写了self 所以我们需要填写形参
# func(1) 结果为 学生都有选课的功能~
print(Student.school_name)
# 相当于 类名+点的方式等价于Student.__dict__.get('school_name')
func2 = Student.choice_course
func2(1)
# 与上方的func = Student.__dict__.get('choice_course') 调用 func(1) 相同
# 类的调用>>>>就可以产生对象:
'''我们通过类名加括号的形式就可产生一个对象,每次产生的对象都不一样'''
object1 = Student()
object2 = Student()
object3 = Student()
print(object1,object2,object3)
# <__main__.Student object at 0x000002AF88E45A30> <__main__.Student object at 0x000002AF88E800D0> <__main__.Student object at 0x000002AF88E800A0>
# 我们可以看到它们的内存地址都是不同的,这也证明了 每次产生的对象都不一样的说法
print(object1.__dict__) # 我们对对象使用__dict__方法 查看objct1-3对象的名称空间
print(object2.__dict__) # 对象的公共数据为'北京大学' 对象的公共功能为'学生都有选课的功能~'
print(object3.__dict__) # 由于对象自己本身内部目前什么都没有 所以打印出来的是三个空字典
print(object1.school_name) # 但是对象还是可以通过点的方式去调用 公共的数据
print(object2.school_name) # 北京大学 * 3
print(object3.school_name)
#<bound method Student.choice_course of <__main__.Student object at 0x000002B48AF05A30>>
# <bound method Student.choice_course of <__main__.Student object at 0x000002B48AF400D0>>
# <bound method Student.choice_course of <__main__.Student object at 0x000002B48AF400A0>>
print(object1.choice_course) # 但是在这里按理来说对象的公共功能不应该内存地址不一样呀
print(object2.choice_course) # 接下来我们来看一下这到底是为什么
print(object3.choice_course)
对象独有数据(属性)
# class Student:
# # 对象公共的数据
# school_name = '北京大学'
#
# # 对象公共的功能
# def choice_course(self):
# print('学生选课功能')
#
#
# object1 = Student()
# object2 = Student()
# '''推导流程1:每个对象手动添加独有的数据'''
# object1.__dict__['name'] = 'xiaoming' # 这里与字典的操作方式一样
# object1.__dict__['age'] = 18 # 有键则修改值 ,无键则新增键值对
# print(object1.__dict__)
# # 现在在我们object1 对象的名称空间内 多了{'name': 'xiaoming', 'age': 18}
# object2.__dict__['name'] = 'wangge'
# object2.__dict__['age'] = 28
# print(object2.__dict__)
# # 现在我们object2 对象 名称空间内 多了{'name': 'wangge', 'age': 28}
# # 我们在类与对象的定义与调用里面说了
# # 对象.__dict__.get(键) == 对象.键
# # 所以我们通过对象.的方式也可以调出对象中存储的数据
# print(object1.age) # 18
# print(object2.name) # wangge
#
# # 成功了,这样的话我们就可以给对象添加独有数据的这些操作封装成一个函数了
# def init(obj, name, age):
# obj.__dict__['name'] = name
# obj.__dict__['age'] = age
# 虽然这个函数封装好了,但是这个函数不光光是学生对象能调用,所有对象都可以调用
# 所以我们需要把这个函数添加到类中
# class Student:
# # 对象公共的数据
# school_name = '北京大学'
#
# # 专门给学生添加独有数据的功能
# def init(obj, name, age):
# obj.__dict__['name'] = name
# obj.__dict__['age'] = age
# # 对象公共的功能
# def choice_course(self):
# print('学生选课功能')
# # 我们通过对象+.的方法就可以将这个添加数据的函数调出来使用
# object1 = Student()
# object2 = Student()
# object1.init(object1,'xiaoming',18)
# object2.init(object2,'wangge',28)
# print(object1.__dict__, object2.__dict__)
# 我们成功了
# 接下来我们来看一下__init__方法
# class Student:
# # 对象公共的数据
# school_name = '北京大学'
#
# # 专门给学生添加独有数据的功能 类产生对象的过程中自动触发
# def __init__(obj, name, age):
# obj.__dict__['name'] = name
# obj.__dict__['age'] = age
#
# # 对象公共的功能
# def choice_course(self):
# print('学生选课功能')
#
# stu1 = Student('xiaoming', 18) # 我们在产生对象的时候在类名()内填写对象的属性即可
# print(stu1.__dict__)
# print(stu1.name)
# print(stu1.school_name)
# 最后一步
class Student:
# 对象公共的数据
school_name = '北京大学'
# 专门给学生添加独有数据的功能 类产生对象的过程中自动触发
def __init__(self, name, age): # 类中定义的双下方法 都会在特定的时间段自动触发
self.name = name # 等价于 self.__dict__['name'] = name
self.age = age
# 对象公共的功能
def choice_course(self):
print('学生选课功能')
stu1 = Student('xiaoming', 18)
print(stu1.name) # xiaoming
print(stu1.school_name) # 北京大学
对象的独有功能(方法)
# 对象的独有功能
class Student:
# 对象公共的数据
school_name = '北京大学'
# 专门给学生添加独有数据的功能 类产生对象的过程中自动触发
def __init__(self, name, age): # 类中定义的双下方法 都会在特定的时间段自动触发
self.name = name # 等价于 self.__dict__['name'] = name
self.age = age
# 对象公共的功能
def choice_course(self):
print(f'学生{self.name}正在选课~')
stu1 = Student('xiaoming', 18)
stu2 = Student('wangge',28)
print(stu1.name) # xiaoming
print(stu1.school_name) # 北京大学
# 对象的数据我们已经处理完毕了,但是它的独有功能又应该放在这个类中的哪里呢?
# 我们只能将定义好的独有功能放进类中,但是类中又有其他对象的公共功能
# 所以我们有了定义
'''定义在类中的功能,默认是绑定给对象使用的,谁使用谁就是主人公'''
stu1.choice_course() # 学生xiaoming正在选课~
stu2.choice_course() # 学生wangge正在选课~
# 对象修改数据值
stu1.name = 'tony' # 当点的名字已经存在的情况下 则修改对应的值
# 对象新增数据值
stu1.pwd = 123 # 当点的名字不存在的情况下 则新增数据
print(stu1.__dict__)
标签:__,.__,name,对象,dict,面向对象编程,print
From: https://www.cnblogs.com/ddsuifeng/p/16851418.html