面向对象的思想设计
面向过程:
在生活案例中:一种看待问题的思维方式,在解决问题的时候,侧重于问题是怎样一步一步解决的,然后亲力亲为的去解决问题
在代码中:代码从上往下依次执行【顺序结构】;各个模块之间的关系尽可能是独立的,当import的时候,加载的顺序也是从上往下
面向对象:
在生活案例中:一种看待问题的思维方式,在解决问题的时候,则重点在于找到一个具有特殊功能的实体或者个体,委托实体或者个体帮忙完成某件事情,这个个体【实体】被称为对象
好处:可以将复杂的问题简单化,将程序员从执行者变成一个指挥者
在代码中:根据不同的需求来执行代码【代码执行顺序不一定】
注意:面向对象只是一个思想,并不是一门编程语言
Python是一门面向对象的编程语言,类和对象是面向对象的核心
类和对象
概念:
类:多个具有特殊功能的个体的集合
对象:在一个类中,一个具有特殊功能的个体,能够帮忙完成某件事情,也被称为实例【instance】
两者之间的关系:类用于描述某一类对象的特征,而对象是类具体的存在
注意:在代码中,一般是先定义类,然后通过类创建对象。类也是一种数据类型(自定义),用法和list,string等相同
类的定义和对象的创建
类的定义:class 类名():
类体
#类的定义【声明】 class MyClass1(): #类的实现【类体】 pass #注意:在同一个py文件中可以同时定义多个类,但是,为了提高代码的可读性,结合模块使用的时候,最好能一个文件中定义一个类 class MyClass2(): pass
说明:Python中使用class关键字定义类;类名为合法的标识符(遵循大驼峰命名法:单词首字母大写);通过缩进区分类体;类体一般包含两部分内容:对类的特征的描述,对类的行为的描述
对象的创建:变量名=类名()
#对象的创建 my = MyClass1()
类的设计
三要素:事物名称【类名】,举例:人,Person
事物的特征【名词,变量】,举例:姓名,年龄,身高
事物的行为【动词,函数/方法】,举例:吃,跑
类中的方法和变量(定义和使用)
是为了描述类的行为和特征。类中的方法【函数】被称为成员方法。类中定义的变量被称为成员变量,也被称为属性。
- 定义:
#1.事物的名称:类名 class Person(): #2.事物的特征:成员变量/属性 name = "" age = 0 height = 0.0 #3.事物的行为:成员方法 #注意:类中的成员方法区别于普通方法;形参部分一定包含self,而且self最好出现在形参列表的第一个 #调用函数的时候,self不需要被传参 #除此之外,成员方法和普通方法的使用完全相同,也设置默认参数,关键字参数或者不定长参数 #self:自己,代表的是类的实例【对象】,self在此处可以是任意的标识符,习惯上使用self def eat(self): print("eating") def run(self): print("runnning")
- 使用
- 内存中的对象:per = Person() #per实际上是一个变量名,存储于栈空间中,它指向了真正的对象,而真正的对象存储于堆空间中
- 动态绑定属性和限制属性:Python是一门动态的语言,程序在运行的过程中,可以给对象动态绑定属性
#属性的动态绑定 #1.Python中可以给一个对象动态添加属性【竖向随着对象的出现而出现】 class MyClass(): num1 = 0 num2 = 10 def fun1(self): print("fun1") def fun2(self,num): print("fun2,",num) my = MyClass() my.num1 = 11 my.num2 = 22 print(my.num1,my.num2) #11 22 my.fun1() #fun1 my.fun2(30) #fun2, 30 my.num3 = 33 #Python中可以给一个对象动态的添加属性,注意:动态添加的属性只能当前对象拥有,其他的对象无法使用 print(my.num3) #33 my1 = MyClass() #属性报错AttributeError: 'MyClass' object has no attribute 'num3' print(my1.num3)
#限制属性:正因为能够动态绑定属性而且动态添加的属性是没有限制的,为了避免这个问题,使用__slots__ #__slots__变量:限制一个类中成员变量的个数 #语法:__slots__ = ("属性1","属性2"。。。) class Test(): __slots__ = ("num1","num2") t1 = Test() t1.num1 = 40 print(t1.num1) #40 t1.num3 = 30 #AttributeError: 'Test' object has no attribute 'num3'
#1.事物的名称:类名 class Person(): #2.事物的特征:成员变量/属性 name = "未知" age = 0 height = 0.0 #3.事物的行为:成员方法 #注意:类中的成员方法区别于普通方法;形参部分一定包含self,而且self最好出现在形参列表的第一个 #调用函数的时候,self不需要被传参 #除此之外,成员方法和普通方法的使用完全相同,也设置默认参数,关键字参数或者不定长参数 #self:自己,代表的是类的实例【对象】,self在此处可以是任意的标识符,习惯上使用self def eat(self,food): print("吃"+food) print("self地址:",id(self)) #self地址: 2918416580792 def run(self): print("runnning",self.name) #类中成员方法和成员变量的使用【被访问】 #1.创建对象 #注意:通过类可以创建多个对象,不同的对象在内存中开辟了不同的空间 p1 = Person() p2 = Person() print(id(p1) == id(p2)) #False a = 10 b = 10 #p1和p2是变量名,称为对象,引用,指向了真正的实体【对象】 #2.访问成员变量 #语法:获取值:对象.属性名 重新赋值:对象.属性名 = 新值 per = Person() #per实际上是一个变量名,存储于栈空间中,它指向了真正的对象,而真正的对象存储于堆空间中 print(per.name) #获取值 per.name = "李四" #重新赋值 print(per.name) #3.调用成员方法 #语法:对象.函数名(实参列表) #注意:self是系统自动传参的,哪个对象调用了成员方法,则self代表的就是该对象【self表示当前对象】 per.eat("苹果") print("per地址:",id(per)) #per地址: 2918416580792, 与self地址相同, self地址随着传参改变 per1 = Person() per2 = Person() print(id(p1) == id(p2)) #False print(id(per1.name) == id(per2.name)) #True #结论:类中的成员变量和成员方法随着对象的出现而出现 per1.run() #runnning 未知 per1.name = "abc" per1.run() #runnning abc