python之面向对象编程
类与对象的概念
1.类:即类别、种类,具有相同特征的一类事物
2.对象:对象是类的具体表现形式,是实际存在的个体。
比如:"人类"就是一个类,而"人"就是一个对象。
PS:类只能描述出公共的特征!不同的特征应该由对象自己描述!比如"人"这个对象是有高有矮的,有胖有瘦的等等...
类与对象的创建
因为对象是类的具体表现形式,所以在代码编程中是先有类才能有对象。在python中"class"关键字就是用来定义类的。
创建类的语法结构:
class 类名:
类体代码
"""
1.类名类似于函数名 但是首字母推荐大写 用于区分
2.类体代码就是存放对象公共数据和功能的地方
"""
定义一个学生的类
class Student:
# 学生类公共的数据
school = '清华大学'
# 学生类公共的功能
def choose_course(self): # self为自动生成,是必须要的,不然无法创建对象
print('学生选课功能')
定义完一个类后,我们可以使用__dict__方法查看类的内部名称空间。
print(Student.__dict__) # 返回值是一个字典
获取类中的数据或调用类中的功能
# 方法一:
print(Student.__dict__['school']) # 获取类中的属性
print(Student.__dict__['choose_course']) # 获取类中的属性
# 方法二:
print(Student.school) # 获取类中的属性
print(Student.choose_course) # 获取类中的属性
类名加括号就是在创建一个对象
stu1 = Student()
print(stu1.school) # 获取类中的属性
stu1.choose_course() # 调用类中的方法
我们也可以修改类中的属性
# 修改类中school的值
Student.school = '北京大学'
print(stu1.school) # 输出:北京大学
对象的实例化
在类中可以添加一个函数名为__init__的函数,这个函数可以给对象添加独有的数据,相当于初始化的作用。
class Student:
def __init__(self, name, age):
'''self接收对象本身'''
self.name = name # 相当于:对象.__dict__['name'] = name
self.age = age # 相当于:对象.__dict__['age'] = age
# 学生类公共的数据
school = '清华大学'
# 学生类公共的功能
def choose_course(self):
print('学生选课功能')
实例化对象
stu1 = Student('tom', 18)
print(stu1.__dict__)
# 输出结果:{'name': 'tom', 'age': 18}
在这个实例化过程中,stu1 = Student('tom', 18)其实就相当于:
stu1 = Student()
stu1.__dict__['name'] = 'tom'
stu1.__dict__['age'] = 18
而类中的__init__方法就是接收了传来的参数并执行以上语句。
PS:
- 函数中的self形参其实就是一个变量名,用于接收对象用的,可以是其他名字,只不过我们约定这样用比较好。
- 类中的函数第一个形参都是用于接收对象的,对象在调用函数时自动传入。
动态方法与静态方法
在面向对象中,类的内置函数的第一个参数都是固定接收对象的,这种我们称为动态方法;如果类的内置函数与平常的函数一样,这种我们称为静态方法;
动态方法
1.绑定给对象的方法
class Student:
def run(self):
print(self)
Student.run(11) # 11
Student().run() # <__main__.Student object at 0x000001B57A5BC390>
类调用绑定给对象的方法:有几个参数就需要传几个参数;
对象调用绑定给对象的方法:自动将对象当做第一个参数传入。
2.绑定给类的方法
class Student:
@classmethod
def eat(cls):
print(cls)
Student.eat() # <class '__main__.Student'>
Student().eat() # <class '__main__.Student'>
类调用绑定给类的方法:自动将类当做第一个参数传入。
对象调用绑定给类的方法:自动将该对象所属的类当做第一个参数传入。
静态方法
使用@staticmethod在类的内部函数上声明,这个函数就变成普通的函数了,类和对象调用这个函数都需要传对应的参数。
class Student:
@staticmethod
def run(a):
print(a)
Student.run('类') # 类
Student().run('对象') # 对象