Python自动化运维之11、面向对象基础

一、简介

  面向对象编程是一种编程方式,使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。类就是一个模板,模板里可以包含多个方法(函数),方法里实现各种各样的功能,对象则是根据模板创建的实例,通过实例,对象可以执行类中的方法,每个对象都拥有相同的方法,但各自的数据可能不同。

二、类、对象和方法

  在Python中,定义类是通过class关键字,class后面紧接着是类名,类名通常是大写开头的单词,紧接着是(‘要继承的类名‘),表示该类是从哪个类继承下来的,可以有多个父类(基类),通常如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类,也可以不写。

class F1(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

f1 = F1(‘python‘,27)	

上面的这个__init__()叫做初始化方法(或构造方法), 在类实例化时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,进行一些初始化的动作,所以我们这里写的__init__(self,name,age)就是要在创建一个角色时给它设置这些属性。

参数self有什么用呢?

1.在内存中开辟一块空间指向f1这个变量名
2.实例化F1这个类首先执行其中的__init__()方法,相当于F1.__init__(f1,‘python‘,27),是为了把‘python‘,27这2个值跟刚开辟的f1关联起来,因为关联起来后,你就可以直接f1.name, f1.age 这样来调用啦。所以,为实现这种关联,在调用__init__方法时,就必须把f1这个变量也传进去,否则__init__不知道要把那2个参数跟谁关联,self其实就是实例化对象f1被当作参数传递了。
3.明白了么哥?所以这个__init__(…)方法里的,self.name = name , self.age = age 等等就是要把这几个值存到f1的内存空间里。

三、面向对象三大特性,封装、继承和多态。  

1、封装

  面向对象有3大特性,首先我们来说第一个特性,封装,封装一般是通过在类中封装数据,而通过对象或者self获取。和其他面向对象的语言类似,也是通过构造函数来进行数据封装。下面来看一下代码。 

class A:
    def __init__(self,name):        # 构造函数,初始化数据,
        self.name=name              # 封装数据

    def f1(self):
        print(self.name)           # 通过self间接获取封装的数据

a=A(‘json‘)                        # 相当于A.__init__(a,‘json‘)将‘json‘封装到a中的name属性中
print(a.name)                      # 直接调用a对象的name属性
a.f1()                             # python会把a当作参数传递给a.f1(a),所以print(a.name)

还有一种封装的方式,使用私用的属性来封装数据,看一下具体的用法,

class A:
    name=‘Jason‘
    __age=18                        # 私有静态字段,
    def __init__(self):
        self.__like=‘soccer‘        # 私有普通字段
        self.hobby=‘kkkk‘

    def f1(self):
        print(self.__age)         # 私有静态字段,私有普通字段只能被类中的方法调用
        print(self.__like)
# A.__age                         # 外部获取不到私有静态字段,数据被封装起来
a=A()                             # soccer
a.f1()                            # 18
print(a.hobby)

复杂的封装(一定要搞清楚): 将类封装进对象中  

class c1:

    def __init__(self,name,obj):
        self.name = name
        self.obj = obj

class c2:

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def show(self):
        print(self.name)

class c3:

    def __init__(self,a1):
        self.money = 123
        self.aaa = a1

c2_obj = c2(‘aa‘,12)          # 将字符串‘aa‘,数字12封装到c2_obj.name和c2_obj.age中
c1_obj = c1(‘python‘,c2_obj)  # 将字符串‘python‘封装到c1_obj.name中,将c2_obj中的属性c2_obj.name,c2_obj.age封装到c1_obj.obj中
c3_obj = c3(c1_obj)           # 将c1_obj中的所有属性,包括(c2_obj的所所有方法和属性)

print(c3_obj.aaa.obj.name)    #c3类中找到c2类中的属性
ret = c3_obj.aaa.obj.show()   #c3类中找到c2类中的方法执行并接收返回值
print(ret)

2、继承  

  继承的本质是将父类中的方法全部复制一份到子类中。Python里面的继承可以多继承,通过继承,可以获得父类的功能,继承的时候,如果父类中有重复的方法,优先找自己

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找,Python2.x分为经典类和新式类(默认是经典类,继承了object父类则为新式类)
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找,Python3.x 统一都是新式类

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

继承的执行过程例子:

class A:
    def f(self):
        print(‘a‘)
class B:
    def f(self):
        print(‘b‘)

    def f1(self):
        print(‘bbbb‘)

class C(A,B):
    def f1(self):
        print(‘c‘)
cc=C()
cc.f()         # 结果为a,在C类中没有f()这个方法时,继承时A基类写在前面,所以优先找A类中的f()方法
cc.f1()        # 结果为c,在C类中有f1()方法,则优先执行自己的方法

下面是重点和难点,在其他源码都是这么干的  

class A:
    def bar(self):
        print(‘bar‘)
        self.f1()

class B(A):
    def f1(self):
        print(‘b‘)

class C():
    def f1(self):
        print(‘c‘)
class D(B):
    def f1(self):
        print(‘d‘)

class E(C,D):
    pass

d=D()
d.bar()

上述继承的执行过程:

  • 1. 对象d是D()的实例,d.bar()首先在D()中找有没有bar()方法
  • 2. 没有则到D()类继承的父类B()类中找有没有bar()方法
  • 3. 没有继续向上一层找B()类继承的父类A()类中找有没有bar()方法
  • 4. A()类中有bar()方法则执行了bar()方法
  • 5. bar()执行了做了两件事:(1)、打印print(‘c‘)    (2)、执行了self.f1()
  • 6. 执行了self.f1(),记住self是d对象,回归到最初 d=D()
  • 7. 则执行了D()中的f1()方法,所以结果是bar和d 

3、除了继承方法,还可以继承父类的构造函数  

# 继承构造方法
class A:
    def __init__(self):
        self.name=‘jason‘

class B(A):
    def __init__(self):
        self.age=‘16‘
        super(B,self).__init__()
        # A.__init__(self)          #另一种继承构造函数的方法

d=B()

三、多态 

  Pyhon不支持Java和C#这一类强类型语言中多态的写法,python本身就是支持多态的,所以在Python面向对象里面讨论多态并没有什么意义,其Python崇尚“鸭子类型”。

class F1:
    pass

class S1(F1):

    def show(self):
        print(‘S1.show‘)

class S2(F1):

    def show(self):
        print(‘S2.show‘)

def Func(obj):
    print(obj.show())

s1_obj = S1()
Func(s1_obj)

s2_obj = S2()
Func(s2_obj)

总结

以上就是本节对于面向对象初级知识的介绍,总结如下:

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

问答专区

问题一:什么样的代码才是面向对象?

答:从简单来说,如果程序中的所有功能都是用 类 和 对象 来实现,那么就是面向对象编程了。

问题二:函数式编程 和 面向对象 如何选择?分别在什么情况下使用?

答:须知:对于 C# 和 Java 程序员来说不存在这个问题,因为该两门语言只支持面向对象编程(不支持函数式编程)。而对于 Python 和 PHP 等语言却同时支持两种编程方式,且函数式编程能完成的操作,面向对象都可以实现;而面向对象的能完成的操作,函数式编程不行(函数式编程无法实现面向对象的封装功能)。

所以,一般在Python开发中,全部使用面向对象 或 面向对象和函数式混合使用

面向对象的应用场景:

  • 多函数需使用共同的值,如:数据库的增、删、改、查操作都需要连接数据库字符串、主机名、用户名和密码
class SqlHelper:

    def __init__(self, host, user, pwd):

        self.host = host
        self.user = user
        self.pwd = pwd

    def 增(self):
        # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
        # do something
        # 关闭数据库连接

    def 删(self):
        # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
        # do something
        # 关闭数据库连接

    def 改(self):
        # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
        # do something
        # 关闭数据库连接

    def 查(self):
    # 使用主机名、用户名、密码(self.host 、self.user 、self.pwd)打开数据库连接
        # do something
        # 关闭数据库连接# do something
  • 需要创建多个事物,每个事物属性个数相同,但是值的需求

如:张三、李四、杨五,他们都有姓名、年龄、血型,但其都是不相同。即:属性个数相同,但值不相同

class Person:

    def __init__(self, name ,age ,blood_type):

        self.name = name
        self.age = age
        self.blood_type = blood_type

    def detail(self):
        temp = "i am %s, age %s , blood type %s " % (self.name, self.age, self.blood_type)
        print temp

zhangsan = Person(‘张三‘, 18, ‘A‘)
lisi = Person(‘李四‘, 73, ‘AB‘)
yangwu = Person(‘杨五‘, 84, ‘A‘)

问题三:类和对象在内存中是如何保存?

答:类以及类中的方法在内存中只有一份,而根据类创建的每一个对象都在内存中需要存一份,大致如下图:

如上图所示,根据类创建对象时,对象中除了封装 name 和 age 的值之外,还会保存一个类对象指针,该值指向当前对象的类。

当通过 obj1 执行 【方法一】 时,过程如下:

  1. 根据当前对象中的 类对象指针 找到类中的方法
  2. 将对象 obj1 当作参数传给 方法的第一个参数 self

  

时间: 2024-10-04 16:15:39

Python自动化运维之11、面向对象基础的相关文章

Python自动化运维课程学习--Day3

本文为参加老男孩Python自动化运维课程第三天学习内容的总结. 大致内容如下: 1.文件操作 2.字符编码转码相关操作 3.函数 0.关于本文中所有运行Python代码的环境: --操作系统:Ubuntu 16.10 (Linux 4.8.0) --Python版本:3.5.2 python2.7.12 --Python IDE: PyCharm 2016.3.2 一.文件操作: 1.文件操作流程:以只读.写(覆盖写).追加写.读写.追加读写.二进制读写等模式打开文件 ==> 得到文件句柄,并

(转)Python自动化运维之13、异常处理及反射(__import__,getattr,hasattr,setattr)

Python自动化运维之13.异常处理及反射(__import__,getattr,hasattr,setattr) 一.异常处理 python异常: python的运行时错误称作异常 (1)语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译 (2)逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成.计算或者输出结果需要的过程无法执行等 python异常是一个对象,表示错误或意外情况 (1)在python检测到一个错误时,将触发一个异常 python可以通常异常传导机

Python自动化运维课程学习--Day2

本文为参加老男孩Python自动化运维课程第二天学习内容的总结. 大致内容如下: 1.python模块初识 2.python程序运行流程 3.python数据类型(只讲了numbers, bool, strings, bytes, list, tuple, dict, set) 4.python数据运算 0.关于本文中所有运行Python代码的环境: --操作系统:Ubuntu 16.10 (Linux 4.8.0) --Python版本:3.5.2 --Python IDE: PyCharm

电子书 Python自动化运维:技术与最佳实践.pdf

本书在中国运维领域将有"划时代"的重要意义:一方面,这是国内一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的作者是中国运维领域的"偶像级"人物,本书是他在天涯社区和腾讯近10年工作经验的结晶.因为作者实战经验丰富,所以能高屋建瓴.直指痛处,围绕Python自动化运维这个主题,不仅详细介绍了系统基础信息.服务监控.数据报表.系统安全等基础模块,而且深入讲解了自动化操作.系统管理.配置管理.集群管理及大数据应用等高级功能.重要的是,完整重现了4个

云计算开发教程:Python自动化运维开发实战流程控制

今天这篇文章是给大家分享一些云计算开发教程,今天讲解的是:Python自动化运维开发实战流程控制. Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false. if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句-- else: 执行语句-- 其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范

Python自动化运维的职业发展道路(暂定)

Python职业发展之路 Python自动化运维工程 Python基础 Linux Shell Fabric Ansible Playbook Zabbix Saltstack Puppet Docker paramiko 原文地址:https://www.cnblogs.com/plf-Jack/p/11074916.html

python自动化运维之路~DAY7

python自动化运维之路~DAY7 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.客户端/服务器架构 C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据:另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信. C/S 架构也可以看做是胖客户端架构.因为客户端需要实现绝大多数的业务

python自动化运维之路~DAY10

python自动化运维之路~DAY10 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

python自动化运维之集中病毒扫描

1.因为我linux的python是2.6.6,所以因为有些模块是2.7的,先进行升级. 步骤地址:http://www.linuxidc.com/Linux/2014-07/104555.htm 2.安装pyclamd yum install -y clamav clamd clamav-update 安装clamavp的相关程序包 chkconfig --level 235 clamd on /usr/bin/freshclam pyClamd-0.3.15.tar.gz安装包安装 3.vi