Python_oldboy_自动化运维之路_面向对象(十)

面向对象编程

OOP编程是利用“类”和“对象”来建立各类模型来实现对真实世界的描述,使用面向对象编程的缘由一方面是由于它可使程序的维护和扩展变得更简单,而且能够大大提升程序开发效率 ,另外,基于面向对象的程序可使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。linux

面向对象的几个核心特性以下编程

Class 类
一个类便是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具有的属性(variables(data))、共同的方法 函数

Object 对象
一个对象便是一个类的实例化后实例,一个类必须通过实例化后方可在程序中调用,一个类能够实例化多个对象,每一个对象亦能够有不一样的属性,就像人类是指全部人,每一个人是指具体的对象,人与人以前有共性,亦有不一样spa

Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法code

Inheritance 继承
一个类能够派生出子类,在这个父类里定义的属性、方法自动被子类继承对象

Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不一样的子类,且每一个子类在继承了一样的方法名的同时又对父类的方法作了不一样的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再经过这个抽象的事物, 与不一样的具体事物进行对话。
对不一样类的对象发出相同的消息将会有不一样的行为。好比,你的老板让全部员工在九点钟开始工做, 他只要在九点钟的时候说:“开始工做”便可,而不须要对销售人员说:“开始销售工做”,对技术人员说:“开始技术工做”, 由于“员工”是一个抽象的事物, 只要是员工就能够开始工做,他知道这一点就好了。至于每一个员工,固然会各司其职,作各自的工做。
多态容许将子类的对象看成父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象能够在运行期间动态绑定blog

1.最简单的类:继承

# -*- coding: UTF-8 -*-
#blog:http://www.cnblogs.com/linux-chenyang/

class Dog(object):
    print("I am a dog!")

d=Dog()

2.基本类的使用方法,理解self的做用:就是为了调用接口

#理解self的做用
#正常状况下:self.name = name就是个局部变量,是不能够被其余函数调用
#可是个人需求就是个人狗可能有不少的功能(balk,eat),都要去调用name这个变量,那就要想出一个方法,在这整个狗(类)之间容许互相调用的一个方式
#这时self的功能就出现了


class
Dog(object): def __init__(self,name,type):           #初始化函数(构造函数) self.name = name                #d.name=name至关于下面用函数表示的 self.type = type                #d.type=type def balk(self):                   #self=d 至关于将另一个函数当作参数传给了这个balk的函数,因此就能够被调用 print("[%s]I am a dog!" %self.name )   
    def eat(self,food): print("[%s] eating [%s]!" %self.name,food)
d = Dog('wangcai','zangao')               #此时就把狗这个角色生成了,生成了可是没有干任何事,这就是一个实例(对象)
print(d.name,d.type)                    #可是能够打印显示出相关的属性,name,type
d.balk()                          
#狗能够执行某个动做,执行函数
d.name = 'wamgcai_1'                   #还能够赋值
print(d.name)
#用函数模拟以上的场景,balk执行wangwang的动做,须要知道是谁叫的,要调用dog函数

def dog(name):
    data = {'name':name}
    return data

def balk(dog_obg):
    print('[%s] wang wang.....' %dog_obg['name'])

d = dog('wangcai')

balk(d)

3.类变量内存

# -*- coding: UTF-8 -*-
#blog:http://www.cnblogs.com/linux-chenyang/
#
#类变量
#1.做为默认公有属性
#2.全局修改或者增长新属性
class Dog(object):
    age = 22                             #类变量:存在类的内存地址里,能够被全部实例共享引用。
    name = '全局'                                           #定义个全局变量,假如没有self.name,那么默认会打印全局
    def __init__(self,name,type):
#        self.name = name                        
        self.type = type

    def balk(self):
        print("[%s]I am a dog!" %self.name,self.age )       #没有写self.age也能被调用

    def eat(self,food):
        print('[%s] eating [%s]' %(self.name,food))

d = Dog('wangcai','zangao')
d.balk()

【类变量的用法】能够用于默认的属性

class People(object):
    nationality = "CN"
    def __init__(self,name,age,job):
        pass

p=People('lijun',22,'IT')
p2=People('lijun_test',22,'IT')

print(p.nationality)                   #生成一个实例,假如不穿参数进去就是cn
p.nationality = 'JP'                   #能够修改
print(p.nationality)

People.weapon = 'Big baojian'          #假设:你不知道有多少个实例,p,p1,p2....都须要给新加个功能,全局修改东西
print(p2.weapon)                       #全部的实例均可以调用了

4.实例变量(成员属性)

    构造函数里面变量都是实例变量
每一个实例,存在本身内存空间里的属性
self.name = name
self.type = type
 

5.共有属性就是类变量

6.私有属性(不想被别人访问到的属性)

  __sex 表明私有属性,仅能在实例的内部各函数(方法)中调用
  隐藏一些功能的实现细节,只给外部暴露调用接口

class People(object):
    nationality = 'CN'      #类变量,存在类的内存地址里,能够被全部实例共享引用
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.__sex = sex        #两个下换线表明私有属性,仅能在实例的内部各函数调用

    def go_to_toilet(self):
        if self.__sex == "boy":
            print('stand up....')
        else:
            print('跪着。。。。')

#若外面想非想调用sex变量,能够封装一下
    def get__sex(self):
        return self.__sex

p = People('wangcai','18','boy')

#print(p.sex)               #此时sex就没法从外部调用了
p.go_to_toilet()            #此时函数内部可使用sex的变量
print(p.get__sex())         #能够实现外面能够

 

 面向对象的特性:

封装(私有属性)

 

封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。

 

封装,也就是把客观事物封装成抽象的类,而且类能够把本身的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏。

相关文章
相关标签/搜索