面向过程:功能上的封装。
面向对象:属性和行为上的封装。
类:是由N多个对象抽取出共同的属性和行为从而归纳总结出来的一种类别。
在python中一切皆对象。
自定义数据类型的语法结构:
class 类名: pass
创建对象的语法格式:
对象名=类名()
class Person(): pass class Cat(): pass class Student(): pass p=Person() c=Cat() s=Student() print(type(p)) print(type(c)) print(type(s))
类的组成
1,类属性:直接定义在类中,方法外的变量
2,实例属性:定义在__init__方法中,使用self打点的变量。
3,实例方法:定义在类中的函数,而且自带参数self。
4,静态方法:使用装饰器@staticmethod修饰的方法。
5,类方法:使用装饰器@classmethod修饰的方法。
class Student(): # 雷属性:定义在类中,方法外的变量 school='武汉某小学' # 初始化方法 def __init__(self,name,age): # name,age 是方法的参数,是局部变量,作用域只能在__init__方法 self.name=name # 左侧是实例属性,右侧是局部变量。将局部变量的值赋给实例属性 self.age=age # 实例方法 def show(self): print(f'学生姓名为{self.name},年龄为{self.age}') # 静态方法 在静态方法中不能调用实例属性和实例方法 @staticmethod def static_method(): # print(self.name) 这里调用会报错 # self.show() 这里调用会报错 print('这是一个静态方法,不能调用实例属性,也不能调用实例方法') # 类方法 在类方法中不能调用实例属性,也不能调用实例方法 @classmethod def class_method(cls): # print(self.name) 这里调用会报错 # self.show() 这里调用会报错 print('这是一个类方法,不能调用实例属性,也不能调用实例方法') #创建实例对象 stu=Student('李磊',23) #实例属性 实例对象.实例属性名访问 print(stu.name,stu.age) #类属性 类名.类属性名访问 print(Student.school) #实例方法 实例对象.实例方法名访问 stu.show() #类方法 类名.类方法名访问 Student.class_method() #静态方法 类名.静态方法名访问 Student.static_method() print('*'*50) stu1=Student('张三',23) stu2=Student('李四',24) stu3=Student('王五',25) stu4=Student('赵六',26) print(type(stu1)) print(type(stu2)) print(type(stu3)) print(type(stu4)) lst=[stu1,stu2,stu3,stu4] for item in lst: item.show()
动态绑定属性和方法
class Student(): # 雷属性:定义在类中,方法外的变量 school='武汉某小学' # 初始化方法 def __init__(self,name,age): # name,age 是方法的参数,是局部变量,作用域只能在__init__方法 self.name=name # 左侧是实例属性,右侧是局部变量。将局部变量的值赋给实例属性 self.age=age # 实例方法 def show(self): print(f'学生姓名为{self.name},年龄为{self.age}') stu1=Student('马云',40) stu2=Student('刘强东',50) stu1.show() stu2.show() # stu2 动态添加一个属性,但这个属性是stu1不存在的 stu2.height=1.86 print(stu2.name,stu2.age,stu2.height) def introduce(): print('这是一个普通方法,但是动态绑定成了对象stu2的方法') stu2.func=introduce # 动态绑定方法 introduce不需要对括号 stu2.func() # stu2调用方法