今天的学习内容:面向对象的概念、类和对象的概念、如何创建类和对象、如何设计属性、属性的查找顺序、初始化方法以及绑定方法与非绑定方法
面向对象概念
提问:什么是面向对象?
答:面向对象是一种编程的思想,它的核心是对象,而程序则是一系列对象的集合,程序员负责调度这些对象来交互从而完成任务。
面向对象的优缺点:
优点
1、扩展性:方便对程序进行扩展,而且当你在对一个对象进行修改的时候不会对其它对象产生影响,而且修改的结果会很快反映到整个体系中。
2、灵活性:不用和面向过程一样对整体大动干戈。
3、重用性:对象可以进行重复调用。
缺点:
1.程序的复杂度提高了:对于新手容易出现过度设计的情况,而在扩展性要求比较低的情景下使用也会增加编程难度。
2.无法预知准确的结果:面向对象是用过对象之间的交互来解决问题,所以不能够预知解决问题的过程,也不能预知准确的结果。
使用场景:
对于扩张性要求比较高的程序,通常直接面向用户的:QQ、微信等
注意:面向对象和面向过程的编程使用一定要根据分析具体的需求来确定。
类和对象概念
类:类就是类型,是一种抽象的概念,也就具备相同特征和相同行为的事物的集合。
对象:就是具体的某个事物,具备它自己的特征与行为,可以看做特征和技能的结合体。
类和对象的关系:类包含一系列对象,对象属于某个类
#先有类还是先有对象 """ 在实际生活中:先有对象后有类 在现实生活中各种各样的事物是具体存在,而我们根据他们的很多相同的特点将它们划分为统一类,但事实上事物是具体存在的,而类只是一个概念,并没有实际存在 在程序中:务必保证先定义类,后产生对象 这与函数的使用是类似的,先定义函数,后调用函数,类也是一样的,在程序中需要先定义类,后调用类,不一样的是,调用函数会执行函数体代码返回的是函数体执行的结果,而调用类会产生对象,返回的是对象 """
总结:我们在使用面向对象编程时,第一步需要思考需要什么样的对象,这些对象我们需要它具备什么样的特征和行为,然后我们根据这些信息得出我们所需要的类型。
如何创建类和对象
#定义类的名称 class 类的名称: # 类的内容描述属性和技能 # 描述属性用变量 # 描述行为用函数 #类的名称 书写规范:首先需要见名知意,然后名称是用大驼峰命名法 #大驼峰就是单词第一个字母大写,小驼峰就是第一个字母小写
#创建对象的语法 class Person: pass #创建对象 p = Person()如何设计属性、属性的查找顺序
#总结:类和对象的定义与调用模式 class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
self:在实例化时自动将对象/实例本身传给__init__的第一个参数
如何设计属性、属性的查找顺序
属性可以写在类中,也可以写在对象中
类中的属性是所有对象公共的,对象中的属性是每个对象独特的(不一样的)
查找顺序:“如果类中和对象中存在同样的属性,先访问对象,如果没有再访问类。
#增加属性 对象变量名称.属性名称 = 属性值 #删除属性 del 对象的变量名称.属性名称 #修改 对象.属性 = 新的值 #查看属性 访问的是对象的所有属性 print(对象.__dict__) #访问对象的类信息 print(对象.__class__)
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
初始化方法
__init__方法:初始化方法,本质上就是一个函数
特点1:当实例化对象时,会自动执行__init__方法。
特点2:会自动将对象作为第一个参数传入,参数名称位self,self可以是别的名字,但是不建议改。
功能:用户给对象赋初始值
class Dog: def __init__(self,kind,color,age): self.kind = kind self.color = kind self.age = age d1 = Dog('二哈','黑白',1) d2 = Dog('泰迪','棕色',2) print(d1.__dict__) # {'kind': '二哈', 'color': '二哈', 'age': 1} print(d2.__dict__) # {'kind': '泰迪', 'color': '泰迪', 'age': 2} #注意,该函数不能有任何返回值,只能是None
#为对象定制一个行为 #就是在类中创建一个函数 def say_hi(self): print("hello i am a student! my name:%s" % self.name) #传入self,可以在其中调用self的属性
绑定与非绑定方法
当使用对象调用该函数时会自动传入对象本身,作为第一个参数
class Student: school = "oldgirl" def __init__(self,name,age,gender): self.name = name self.age = age self.gender = gender def say_hi(self): print("hello i am a student! my name:%s" % self.name) stu1 = Student("jack",20,"male") # 使用对象调用该函数,会自动传入 stu1.say_hi() Student.say_hi(stu1) # 使用类来调用,就是一个普通函数,有几个参数就传几个
类绑定方法
class OldBoyStudent: school = "oldboy" def __init__(self,name): self.name = name @classmethod def show_school(cls): print(cls)
OldBoyStudent.show_school() # <class '__main__.OldBoyStudent'>
print(OldBoyStudent) # <class '__main__.OldBoyStudent'>
语法:@staticmethod
@staticmethod def print_hello(): print("hello world")
总结
类与对象
对象的本质是一个容器/名称空间,用来存放对象特有的属性。
类的本质也是一个容器/名称空间,用来存放对象相同的属性。
类的用途有两种:
1.当容器使用时,用来存放类的数据属性和类的函数属性
2.调用类的过程,也就是实例化,产生的结果是对象。
(实例化过程:①先产生一个空对象②触发__iniit__(空对象,arg1,arg2...))