Python自动化运维开发----基础(十五)Python面向对象-创新互联

1.面向过程和面向对象的区别

甘德网站建设公司创新互联,甘德网站设计制作,有大型网站制作公司丰富经验。已为甘德近千家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的甘德做网站的公司定做!

面向过程 : 需要用什么代码去解决什么问题

面向对象 : 我有什么可以给你什么

2.面向对象的特征

(1)封装

数据不想让别人接触到的

函数(过程) =》 方法(在面向对象中):提供函数、方法对数据进行访问和操作

(2)继承

有一块代码块 A(函数)

B 也想有一个代码块(函数)

(3)多态

一个对象可以体现不同的特征

3. 实验

创建一个类

>>> class Person(object): ...     pass ...

创建一个实例对象

>>> kk = Person()  >>> type(kk)

创建实例对象的属性

>>> kk.name = 'kk' >>> dir(kk) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__',\  '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'\  , 'name']

定义类的属性

>>> class person(object): ...     name = 'kk' ...  >>> kk = person() >>> kk.name 'kk'

类、实例对象查找属性也是有顺序的:先在实例对象中找,如果实例对象中没,接着去类中属性找,如果类中属性没的话就报错了

小案例: 更好的区分类的属性和实例对象的属性

创建一个类

>>> class Person(object): ...     name = 'kk' ...

创建实例对象name1 并给实例对象添加 addr 属性

>>> name1 = Person() >>> name1.addr = '西安市'

创建实例对象name2 并给实例对象添加 age 属性

>>> name2 = Person() >>> name2.age = 25

测试访问name1 的age 属性 是报错的 因为 实例对象name1和类中都没有age属性

>>> name1.age Traceback (most recent call last):   File "", line 1, in  AttributeError: 'Person' object has no attribute 'age'

分别打印类、实例对象name1、实例对象name2的name属性

>>> print(person.name,name1.name,name2.name) kk kk kk

给实例对象name1重新设置一下name 属性,在依次打印name属性

>>> print(person.name,name1.name,name2.name) kk kk1 kk

案例总结:

(1)类的属性和实例的属性可以动态赋值

(2)在访问实例对象的属性时,优先访问实例对象的属性;当实例对象的属性不存在的时候,去访问类的属性,类的属性不存在就报错

(3)实例对象设置和修改属性的时候,不会影响类的属性

4.类

初始化函数(构造函数)

以下类中的初始化函数

>>> class person(object): ...     def __init__(self): ...         self.name = 'kk' ...         self.age = 24 ...

创建一个实例对象

>>> name1 = person() >>> name1.name 'kk' >>> name1.age 24

重新创建一个类

>>> class person(object):    ...     name = 'Dog' ...     def __init__(self): ...         self.name = 'dog' ...

分别打印类和实例对象的name属性

>>> name1 = person() >>> print(name1.name, person.name) dog Dog

类的方法,如下创建类的方法

>>> class Test(object): ...     Name = 'Test' ...     @classmethod ...     def class_method(cls): ...         print(cls.Name) ...

访问类的方法

>>> Test.class_method() Test

创建实例对象test ,实例对象访问类的方法

>>> test = Test() >>> test.class_method() Test

实例的方法

>>> class Test(object): ...     Name = 'Test' ...     def __init__(self): ...         self.name = 'test' ...     def instance_method(self): ...         print(self.name) ...         print(self.Name) ..

访问实例的方法

>>> t = Test() >>> t.instance_method() test Test

静态方法 (@staticmethod)

>>> class Test(object): ...     @staticmethod ...     def static_method(): ...         print('static_method') ...  >>> Test.static_method() static_method

小案例

猫狗大战,猫的初始生命值是120 , 狗的初始生命值是100,random随机掉血,采用继承的方式

#!/usr/bin/python import random class Animals(object):     def __init__(self,name,blood=100):         self.name = name         self.blood = blood     def get_name(self):         return self.name     def get_blood(self):         return self.blood     def drop_blood(self,blood):         self.blood -= blood     def attack(self,rival):         drop = random.randint(0,20)         rival.drop_blood(drop)         print(self.name,'让',rival.name,'掉血',drop,'对手剩余:',rival.get_blood(),'血') class Dog(Animals):     pass class Cat(Animals):     pass if __name__ == '__main__':     dog = Dog('wangwang')     cat = Cat('miaomiao',120)     while True:         dog.attack(cat)         if cat.get_blood() < 0:             print('胜利方是:',dog.get_name())             break         cat.attack(dog)         if dog.get_blood() < 0:             print('胜利方是:',cat.get_name())             break

执行结果:

Python自动化运维开发----基础(十五)Python面向对象

重写父类的***方法,让狗***猫时掉血范围在10-30

class Dog(Animals):     def attack(self,rival):         drop = random.randint(10,30)         rival.drop_blood(drop)         print(self.name,'让',rival.name,'掉血',drop,'对手剩余:',rival.get_blood(),'血')

Python自动化运维开发----基础(十五)Python面向对象

重写父类的方法,当猫受到的***大于20 的时候自动补血 8

class Cat(Animals):     def drop_blood(self,drop):         super(Cat,self).drop_blood(drop)         if drop > 20 :             print('我掉了',drop,'滴血,触发自动补血技能')             self.blood += 8

5.实例的私有属性

定义一个类

>>> class Person(object): ...     def __init__(self,name,age): ...         self.__name = name ...         self.__age = age ...

创建一个实例,并尝试访问实例的属性,会报错

>>> kk = Person('kk',30) >>> kk.name Traceback (most recent call last):   File "", line 1, in  AttributeError: 'Person' object has no attribute 'name'

私有属性的访问

>>> kk._Person__age 30

@property 和 @方法名.setter的使用

@property 把一个方法变成属性去调用 

@方法名.setter是把一个方法变成属性赋值

>>> class Person(object): ...     def __init__(self,name,age): ...         self._name = name ...         self._age = age ...     @property ...     def name(self): ...         return self._name ...     @name.setter ...     def name(self,value): ...         self._name = value ...

访问测试

>>> kk = Person('kk',20) >>> kk.name 'kk' >>> kk.name = 'kk1' >>> kk.name 'kk1'

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页名称:Python自动化运维开发----基础(十五)Python面向对象-创新互联
本文地址:http://scyanting.com/article/dscgih.html