什么是对象
对象是由“数据”和“功能”组合而成,而编写程序的本质就是对数据的操作。在没有学“对象”之前,之前所编写的代码,数据和功能都是分开的。对象其实就是一个“容器”,容器内存放着数据和功能
name = 'kevin'
age = 22
sex = 'male'
def info():
print('Name:%s Age:%s Sex:%s' % (name, age, sex))
if __name__ == '__main__':
info()
# Name:kevin Age:22 Sex:male
什么是面向对象编程
面向对象编程就是造出很多个的对象,将原本分散开的相关数据与功能整合到一个个的对象里,既方便使用,也提高了程序的解耦合程度,从而提升了程序的可扩展性(需要强调的是,软件质量属性包含很多方面,面向对象解决的仅仅只是扩展性问题)
类与对象的创建
定义
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例 ,在代码编程中是先有类才能有对象
语法
class 类名:
'类的帮助信息' #类文档字符串
class_suite #类体代码 (存放功能和数据的地方)
class
是定义类的关键字- 类名类似于函数名,推荐首字母大写
- 类体代码就是数据、功能(数据:变量名 = 变量值,功能:函数)
使用
class Student:
name = 'kevin'
age = 22
gender = 'male'
def info(self):
print("个人信息")
print(Student.name)
# kevin
print(Student.info)
# <function Student.info at 0x7fb999bc86a8>
""" 查看名称空间的方法:__dict__ """
print(Student.__dict__) # 返回值是一个字典
print(Student.__dict__['age']) # 获取类中的属性
# 22
print(Student.__dict__['info'])
# <function Student.info at 0x7fec2a1c0510>
"""类名加括号就是产生一个对象"""
obj_1 = Student()
obj_2 = Student()
print(obj_1.__dict__, obj_2.__dict__)
# {} {}
print(obj_1.name)
# kevin
print(obj_2.name)
# kevin
print(obj_1.info)
# <bound method Student.info of <__main__.Student object at 0x7f86f1bc6518>>
print(obj_2.info)
# <bound method Student.info of <__main__.Student object at 0x7ff644cc6470>>
Student.name = 'tony'
print(obj_1.name) # Student.__dict__['name'] = tony 修改对应的值
# tony
print(obj_2.name)
# tony
对象的实例化
将类产生对象的过程叫做对象的实例化
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('学生选课功能')
obj_1 = Student('kevin', '22', 'male')
print(obj_1.__dict__)
# {'name': 'kevin', 'age': '22', 'gender': 'male'}
obj_2 = Student('tony', '18', 'male')
print(obj_2.__dict__)
# {'name': 'tony', 'age': '18', 'gender': 'male'}
实例化一个对象总共发生了三件事:
- 在内存中开辟了一个对象空间
- 自动执行类中的
__init__
方法,并将这个对象空间(内存地址)传给了__init__
方法的第一个位置参数self
- 在
__init__
方法中通过self
给对象空间添加属性
补充:
- 针对括号内第一个形参
self
其实就是一个普通的变量名而已,只不过该变量名将来专门接收对象的,所以给它起了个固定的名字叫self
- 类中的
__init__
方法会在类产生对象的时候自动执行
绑定方法
在类中定义的函数默认都是绑定给对象使用的,即对象来调 会自动将对象当做第一个参数传入
class Student:
school = '清华大学'
# __init__方法不要自己去调用
def __init__(self, name, age):
self.name = name
self.age = age
def index_1(self, num):
print('%s正在调用index_1方法' % self.name, num)
def index_2(self):
print('%s正在调用index_2方法' % self.name)
def index_3(self, num):
print('正在调用index_3方法', self, num)
obj_1 = Student('kevin', 22)
obj_2 = Student('tony', 18)
Student.index_3(111, 2222) # 类调用类中函数 有几个参数就需要传几个参数
# 正在调用index_2方法 111 2222
obj_1.index_3(111) # 对象调用类中函数,会将当前调用的对象当做第一个参数自动传入
# 正在调用index_3方法 <__main__.Student object at 0x7f8ff62ccf98> 111
print(obj_1.index_1)
# <bound method Student.index_1 of <__main__.Student object at 0x7fa3122cc978>>
print(obj_1.index_2)
# <bound method Student.index_2 of <__main__.Student object at 0x7fa3122cc978>>
动态方法与静态方法
动态方法
绑定对象的方法
class Student:
def run(self):
print(self)
Student.run("我是动态添加的") # 类调用绑定给对象的方法,有几个参数就需要传几个参数
# 我是动态添加的
obj = Student() # 对象调用绑定给对象的方法,会自动将对象当做第一个参数传入
obj.run()
# <__main__.Student object at 0x7fcf6ba57860>
绑定给类的方法
class Student:
@classmethod # 加上装饰器@classmethod后,该函数就绑定到了类
def run(cls):
print(cls)
Student.run()
# <class '__main__.Student'>
obj = Student()
obj.run()
# <class '__main__.Student'>
补充:
绑定到类的方法就是专门给类用的,但其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的,并且容易引起混淆,这也是Python
的对象系统与其他面向对象语言对象系统的区别之一
静态方法
class Student:
@staticmethod
def run(a): # 调前都必须传固定的参数个数
print(a)
# 类调用静态方法要,自己传值
Student.run('Hello')
# Hello
# 对象调用静态方法要,自己传值
obj = Student()
obj.run('kevin')
# kevin
补充:
静态方法是类中的函数,不需要实例,静态方法主要用来存放逻辑逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作,可以理解为将静态方法存在此类的名称空间中