博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二、Python开发---14、面向对象

Posted on 2019-10-11 09:19  兰智杰  阅读(206)  评论(0编辑  收藏  举报

面向对象

  面向过程:根据业务逻辑从上到下写垒代码

  面向对象:对函数进行分类和封装,让开发“更快更好更强…”  

  面向对象编程的两个非常重要的概念:类和对象

  类是对象的类型,具有相同属性和行为事物的统称;对象是类的实例,类是抽象的,在使用的时候通常会找到这个类的一个具体存在

定义类

  类由三个部分构成—— 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 模块