标签:__ obj1 obj2 name 面向对象 Student print
内容概要
- 面向对象编程思想
- 类与对象的概念
- 类与对象的创建
- 对象的实例化
- 绑定方法
内容详情
# 编程思想
1.面向过程编程
将程序的执行流程化 即分步操作 分步的过程中解决问题
eg: 注册、登录、结算购物车...
"""注册:第一步获取用户名 第二步比对用户名数据 ..."""
"""结算:第一步获取购物车数据 第二步计算钱数 ..."""
过程可以理解成是流水线 面向过程编程可以理解成是在创建一条流水线
2.面向对象编程(将数据与功能整合到一起的操作其实就是 面向对象编程的思想)
核心就是'对象'二字
对象其实就是一个"容器" 将数据与功能整合到一起
只要是符合上述描述的事物都可以称之为是对象!!!
eg: 人狗大战最后的函数内部含有数据和功能 可以称之为面向对象编程
模块文件内部含有数据和功能 也可以称之为面向对象编程
"""仔细的想想会发现 python中一切皆对象!!!"""
python针对面向对象编程提供了专门的语法 识别度更高 编写更精简
eg: 人、动物、游戏角色
"""
面向过程与面向对象两者没有优劣之分 具体要结合实际情况
甚至很多时候两者是混合在一起的!!! 思想占据的比例不同而已
"""
对象:数据与功能的结合体
类:即类别、种类 相当于诸多对象公有的特征(数据、功能)!!!
"""
在现实生活中
人 对象
一群人 人类
狗 对象
一群狗 犬类
上述中的人类、犬类是用来描述多个对象'相同'特征的名词
黄种人 黑种人 白种人都属于人类 但是彼此也有不同的特征
类只能描述出公共的特征!!! 不同的特征应该由对象自己描述!!!
"""
ps:类其实也算对象>>>:一切皆对象
"""在代码编程中是先有类才能有对象"""
# 先定义类 后产生对象
学生类
class Student:
# 学生类公共的数据
school = '清华大学'
# 学生类公共的功能
def choose_course(self):
print('学生选课功能')
"""类体代码无需调用就会执行 产生类的名称空间"""
"""
语法结构
class 类名:
类体代码
1.class是定义类的关键字
2.类名类似于函数名 但是首字母推荐大写 用于区分
3.类体代码就是存放对象公共数据和功能的地方
数据: 变量名 = 变量值
功能: 函数
"""
# 查看名称空间的方法>>>:__dict__
print(Student.__dict__) # 返回值是一个字典
print(Student.__dict__['school']) # 获取类中的属性
print(Student.__dict__['choose_course']) # 获取类中的属性
"""类获取数据和功能有一个简便的方式>>>:句点符"""
print(Student.school)
print(Student.choose_course)
# 如何产生对象:类名加括号
obj1 = Student() # 类名加括号就是在产生一个对象
obj2 = Student()
print(obj1.__dict__, obj2.__dict__) # {} {}
print(obj1.school, obj2.school) # 清华大学 清华大学
print(obj1.choose_course, obj2.choose_course) # bound method(绑定的方法/功能) bound method
print(obj1.school) # 清华大学
print(obj2.school) # 清华大学
Student.school = '北京大学' # Student.__dict__['school'] = '北京大学' 修改名字与值的对应关系
print(obj1.school) # 北京大学
print(obj2.school) # 北京大学
# 学生类
class Student:
def __init__(self, name, age, gender):
'''该方法就一个功能>>>:给对象添加独有的数据'''
self.name = name # obj.__dict__['name'] = name
self.age = age # obj.__dict__['age'] = age
self.gender = gender # obj.__dict__['gender'] = gender
# 学生类公共的数据
school = '清华大学'
# 学生类公共的功能
def choose_course(self):
print('学生选课功能')
obj1 = Student() # 目前对象没有自己独有的属性
obj2 = Student() # 目前对象没有自己独有的属性
print(obj1.__dict__) # 大白话就是给字典添加键值对
print(obj2.__dict__) # 大白话就是给字典添加键值对
# 推导过程
'''方案1:逐步给对象添加独有的数据'''
obj1.__dict__['name'] = 'jason' # obj1.name = 'jason'
obj1.__dict__['age'] = 18 # obj1.age = 18
obj1.__dict__['gender'] = 'male' # obj1.gender = 'male'
obj2.__dict__['name'] = 'kevin' # obj2.name = 'kevin'
obj2.__dict__['age'] = 2 # obj2.age = 28
obj2.__dict__['gender'] = 'female' # obj2.gender = 'female'
print(obj1.__dict__,obj2.__dict__)
print(obj1.name) # jason
print(obj2.name) # kevin
'''方案2:将冗余的添加步骤封装成函数'''
def init(obj,name,age,gender):
obj.name = name # obj.__dict__['name'] = name
obj.age = age # obj.__dict__['age'] = age
obj.gender = gender # obj.__dict__['gender'] = gender
init(obj1,'jason',18,'male')
init(obj2,'kevin',28,'female')
print(obj1.name)
print(obj2.name)
'''方案3:简单的封装成函数没有提现出面向对象整合的精髓>>>:将函数写到类中去'''
obj1 = Student()
obj2 = Student()
Student.set_info(obj1,'jason',18,'male')
Student.set_info(obj2,'kevin',28,'female')
print(obj1.name) # jason
print(obj2.name) # kevin
'''方案4:类中针对给对象创建独有数据的函数名 专门定义了一个固定的方法'''
obj1 = Student('jason', 18, 'male')
obj2 = Student('kevin', 28, 'female')
print(obj1.__dict__)
print(obj2.__dict__)
类中的__init__方法会在类产生对象的时候自动执行
类产生对象的具体步骤 # 类产生对象的过程叫做对象的'实例化'
1.先创建一个没有独有数据的空对象 {}
2.将空对象和类括号内传入的数据一并交给__init__执行
__init__的第一个参数就是对象本身
__init__(obj,name,age,gender)
3.将创建好的对象自动返回
给你提供这种方式能够减少代码的编写
ps:针对括号内第一个形参self其实就是一个普通的变量名而已只不过该变量名将来专门接收对象的 所以给它起了个固定的名字叫self
# 动态方法
1.绑定给对象的方法
class Student:
school = '清华大学'
# __init__方法不要自己去调用
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('%s正在调用func方法'%self.name)
def index(self):
print('%s正在调用index方法'%self.name)
obj1 = Student('jason', 18)
print(obj1)
obj2 = Student('kevin', 28)
类调用绑定给对象的方法:有几个参数就需要传几个参数
Student.func(self)
在类中定义的函数默认都是绑定给对象使用的 即对象来调 会自动将对象当做第一个参数传入
obj1.func()
obj2.func()
print(obj1.func)
print(obj2.index)
'''所以应该能理解为什么类中所有的函数第一个参数都是self'''
2.绑定给类的方法
class Student:
@classmethod
def eat(cls):
prtin(cls)
类调用绑定给类的方法:会自动将类当做第一个参数传入
print(Student) # <class '__main__.Student'>
Student.eat() # <class '__main__.Student'>
对象调用绑定给类的方法:也不需要传参 会讲产生该对象的类自动当做第一个参数传入
obj1.eat() # <class '__main__.Student'>
# 静态方法
class Student:
@staticmethod
def speak(a):
print(a)
1.普普通通的函数:无论谁来调 都必须传固定的参数个数
类调用静态方法:要自己传值
Student.speak(123)
对象调用静态方法:要自己传值
obj1.speak(321)
标签:__,obj1,obj2,name,面向对象,Student,print
来源: https://www.cnblogs.com/keep-on-going/p/16120614.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。