面向对象
面向过程:根据业务逻辑从上到下写垒代码
面向对象:对函数进行分类和封装,让开发“更快更好更强…”
面向对象编程的两个非常重要的概念:类和对象
类是对象的类型,具有相同属性和行为事物的统称;对象是类的实例,类是抽象的,在使用的时候通常会找到这个类的一个具体存在
定义类
类由三个部分构成—— 1、类的名称:类型2、属性:对象的属性3、方法:对象的方法,即类中定义的函数
定义类 class 类名:
属性列表
方法列表
实例化:创建一个类的实例,类的具体对象
方法:类中定义的函数。
对象:通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)和方法。
类变量(类属性):类变量在整个实例化的对象中是公用的;类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用,如果需要用在函数中使用类名.类属性
实例变量(实例属性 ):定义在方法中的变量,只作用于当前实例的类
__init__()构造方法和self
__init__()是一个特殊的方法属于类的专有方法,被称为类的构造函数或初始化方法,方法的前面和后面都有两个下划线;这是为了避免Python默认方法和普通方法发生名称的冲突;每当创建类的实例化对象的时候,__init__()方法都会默认被运行;作用就是初始化已实例化后的对象
在方法定义中,第一个参数self是必不可少的;类的方法和普通的函数的区别就是self,self并不是Python的关键字,完全可以用其他单词取代他,只是按照惯例和标准的规定,推荐使用self
针对类的属性的一些方法
可以使用实例化对象名 + . 来访问对象的属性,也可以使用以下函数的方式来访问属性
getattr(obj, name[, default]) : 访问对象的属性
hasattr(obj,name) : 检查是否存在一个属性
setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性
delattr(obj, name) : 删除属性
注意:name需要加单引号,obj为实例化对象名称
内置类属性
__dict__ : 类的属性(包含一个字典,由类的属性名:值组成) 实例化类名.__dict__
__doc__ :类的文档字符串 (类名.)实例化类名.__doc__
__name__: 类名,实现方式 类名.__name__
__bases__ : 类的所有父类构成元素(包含了类的所有父类组成的元组)
class person(): #用__doc_进行输出的解释性语句 ''' #这是个类 ''' country = '中国' #声明类属性,并且赋值 def __init__(self,name,age,sex): #构造方法---实例属性通过构造方法来声明---self不是关键字,代表的是当前而对象 #构造方法不需要调用,在实例化的时候自动调用 print('我是构造方法,在实例化得时候调用') self.name = name #通过self 创建实例属性,并且赋值 self.age = age self.sex = sex def getName(self): #创建普通方法 print('我的名字叫:%s,我来自%s'%(self.name,person.country)) #在方法里面使用实例属性 #实例化对象---这个people01 就要具有三个属性,并且可以使用getName方法 people01 = person('joe',19,'男') #在实例化的时候传递参数 #访问属性 通过对象名.属性名 访问实例属性(对象属性) print(people01.name) #输出为joe print(people01.age) #输出为19 print(people01.sex) #输出为男 #通过内置方法访问属性 print(getattr(people01,'name')) #输出为joe print(hasattr(people01,'name')) #输出为Ture setattr(people01,'name','susan') print(people01.name) #输出为susan delattr(people01,'name') #print(people01.name) #会报错 setattr(people01,'name','杰大哥') print(people01.name) #输出为杰大哥 #通过对象调用实例方法 people01.getName() #输出为 我的名字叫:杰大哥,我来自中国 #内置类属性 print(people01.__dict__) #输出为{'age': 19, 'sex': '男', 'name': '杰大哥'} #将实例对象的属性和值通过字典的形式返回 print(people01.__doc__) #输出为 #这是个类 print(person.__name__) #输出为person 返回类名(用处不大) print(person.__bases__) #输出为(<class 'object'>,) people02 = person('susan',19,'女') #输出为 我是构造方法,在实例化得时候调用 #country为类属性,所有的对象都一样 people02.getName() #输出为 我的名字叫:susan,我来自中国
__name__
__name__:如果是放在Modules模块中,就表示是模块的名字;如果是放在Classs类中,就表示类的名字;
__main__:模块,xxx.py文件本身被直接执行时,对应的模块名就是__main__;可以在if __name__ == “__main__”:中添加想要的,用于测试模块,演示模块用法等代码;作为模块,被别的Python程序导入(import)时,模块名就是本身文件名xxx
例子:第一个文件名称为模块.py,代码如下
#_*_coding:utf-8_*_ ''' 输出为 我是杰大哥 __main__ ''' def a(): print('我是杰大哥') if __name__ == '__main__': a() print(__name__) #在当前脚本运行 输出 __main__
第二个文件名称为模块10.10.2.py,代码如下
#_*_coding:utf-8_*_ ''' 引入 模块.py 文件 输出为 模块
当前文件运行时没有输出 我是杰大哥 ''' import 模块