Python自动化运维开发----基础(十五)Python面向对象
admin
2023-07-11 19:25:01
0

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'


相关内容

热门资讯

OpenAI,正式组建机器人事... 人工智能(AI)领域巨头OpenAI发布公告,宣布大力扩张内部机器人事业部,正式全面切入硬件赛道,实...
星火空间完成近亿元Pre-A轮... 据星火空间消息,6月1日,合肥星火空间科技有限公司完成近亿元Pre-A轮融资。本轮融资由云泽资本和轨...
刚刚,宇树IPO闪电过会!王兴... 智东西 作者 | 许丽思 编辑 | 漠影 智东西6月1日报道,刚刚,宇树通过上交所上市委会议审议。 ...
京东工业发起百川计划 携手上游... 京东工业大模型生态发布会6月1日在北京举行,京东工业携手合作伙伴正式开启“百川计划”,从数据、模型、...
强脑科技预计今年机械手销量大涨... IT之家 6 月 2 日消息,据彭博社 2 日(今天)报道,强脑科技预计,随着中国人形机器人产业快速...
一图看懂差距!iPhone 1... 快科技6月2日消息,iPhone 18 Pro不同版本电池容量不同的相关话题冲上社交平台热搜榜,引发...
iPhone 18 Pro 或... 据科技狐,近日,知名爆料人 Sonny Dickson 分享了 iPhone 18 Pro 全套机模...
武契奇:不排除卸任总统后担任总... 塞尔维亚总统武契奇近期密集释放政坛人事与大选相关信号,明确无意在 2027 年总统任期届满后谋求连任...
6月新机夯到拉盘点,告诉你哪台... 现在这形势,手机升价是不可能躲得过的了,而且涨价期至少持续两年。那既然内存涨价躲不过,就只能选升级大...
伊朗公开已故最高领袖哈梅内伊安... 新华社德黑兰6月2日电 据伊朗伊斯兰共和国通讯社2日报道,根据伊朗已故最高领袖阿里·哈梅内伊生前遗愿...