• Python基础之面向对象


    面向对象技术简介

    • 类(Class):用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
    • 类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
    • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关数据。
    • 方法重写:吐过从父类继承的方法不能满足子类的需求,可以对其进行改写,这锅过程叫发放的颠覆(override),也称为方法的重写。
    • 实例变量:定义在方法中的变量,只作用与当前的实例的类。
    • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法,继承也许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这事模拟是一个(is-a)'关系(例图,Dog是一个Animal)。
    • 实例化:创建一个类的实例,类的具体对象。
    • 方法:类中定义的函数。
    • 对象:通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)和方法。

    类的定义:

    语法格式如下:

    '''
    class 类名:
        '类的文档字符串'
        类体
    '''
    #我们创建一个类
    class Data:
        pass

    类的两种作用:属性引用和实例化

    属性引的语法(类名.属性)

    class Person:                   #定义一个类(人类),类名的首字母必须为大写
        role = '中国人'                #人的角色属性都是人
        def walk(self):                 #人都可以走路,也就是有一个走路方法
            print('person is walking...')
            
    print(Person.role)                  #查看人的role属性
    print(Person.walk)                  #引用人的走路方法,注意这里不是在调用

    实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例来定制自己的特征

    class Person:                         #定义一个人类
        role = 'person'                     #人的角色属性都是人
        def __init__(self,name):
            self.name = name                #每一个角色都有自己的昵称
            
        def walk(self):                     #人都可以走路,也就是有一个走路的方法
            print('person is walking...')
    
    print(Person.role)                      #查看人的role属性
    print(Person.walk)                      #引用人的走路方法,注意这里不是在调用

    实例化的过程就是累——>对象的过程

    原本我们只有一个Person类,在这个过程中产生了一个egg对象,有自己具体的名字、攻击力、生命值。

    语法如下:对象名 = 类名(参数)

    egg = Person('egon')  #类名()就等于在执行Person.__init__()
    #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。
    #你可以偷偷的理解:egg = {'name':'egon','walk':walk}

    查看属性&调用发放

    print(egg.name)         #查看属性值:对象名、属性名
    print(egg.walk())       #调用方法:对象名.方法名()

    关于self

    self是实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给它起个别名,但是不建议更改。

    类属性的补充:

    # 一、我们定义的类的属性到底存到哪里了?有以下两种发放查看
    # dir(类名):        #查出的是一个名字列表
    # 类名.__dict__:    #查出的是一个字典,key为属性名,value为属性值
    # 
    # 二、特殊的类属性
    # 类名.__name__         #类的名字(字符串)
    # 类名.__doc__          #类的文档字符串
    # 类名.__base__         #类的第一个父类(在讲继承时会讲)
    # 类名.__bases__        #类的所有父类构成的元祖(在讲
    # 类名.__dict__         #类的字典属性
    # 类名.__module__       #类定义所在的模块
    # 类名.__class__        #实例对应的类(仅新式类中)

    对象的相关知识

    继续人狗大战,现在我们需要对我们的类做出一点点改变,人类除了可以走路之外,还应该具备一些攻击技能。

    class Person:                       #定义一个人类
        role = 'person'                     #人的角色属性都是人
        def __init__(self,name,aggressivity,life_value):
            self.name = name                #每一个角色都有自己的昵称
            self.aggressivity = aggressivity    #给角色增加攻击力
            self.life_value = life_value        #给角色增加生命值
    
        def attack(self,dog):
             '''人可以攻击狗,这里的狗也是一个对象。
             人攻击狗,那么狗的生命值就会根据人的攻击力而下降'''
             dog.life_value =dog.life_value - self.aggressivity     #等同于dog.life_value -= dog.aggressivity
    
    # 对象是关于类而实际存在的一个例子,即实例
    # 对象/属性只有一种作用:属性引用
    egg = Person('egon',50,1000)        #指定人物,攻击力,生命值并且复制给到egg对象
    print(egg.name)                     #输出人物昵称
    print(egg.aggressivity)             #输出人物攻击力
    print(egg.life_value)               #输出人物生命值

    当然也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,我们也管它叫动态属性。引用动态属性并不是执行这个方法,要想调用方法和调用函数是一样的,都需要在后面加上括号。

    print(egg.attack)      

    面向对象小结--定义及调用的固定模式

    class 类名:
        def __init__(self,参数1,参数2):
            self.对象的属性1 = 参数1
            self.对象的属性2 = 参数2
    
        def 方法名(self):pass
    
        def 方法名(self):pass
    
    对象名 = 类名(1,2)               #对象就是实例,代表一个具体的东西
    #类名():类名+括号就是实例化一个类,相当于调用了__init__方法
    #括号里传参数,参数不需要self,其它与init中的形参--对应
    #结果返回一个对象
    对象名.对象属性1                  #查看对象的属性,直接用  对象名.属性名     即可
    对象名.方法名()                   #调用类中的方法,直接用  对象名.方法名() 即可

    对象之间的交互

    现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人。现在我们要再创建一个狗类,所以我们要给狗一个bite方法有了狗类,我们还要实例化一只实实在在的狗出来,然后人和狗就可以打架了。

    class Person:                       #定义一个人类
        role = 'person'                     #人的角色属性都是人
        def __init__(self,name,aggressivity,life_value):
            self.name = name                #每一个角色都有自己的昵称
            self.aggressivity = aggressivity    #给角色增加攻击力
            self.life_value = life_value        #给角色增加生命值
    
        def attack(self,dog):
             '''人可以攻击狗,这里的狗也是一个对象。
             人攻击狗,那么狗的生命值就会根据人的攻击力而下降'''
             self.life_value -= self.aggressivity     #等同于dog.life_value -= dog.aggressivity
    
    # 对象是关于类而实际存在的一个例子,即实例
    # 对象/属性只有一种作用:属性引用
    egg = Person('egon',50,800)        #指定人物,攻击力,生命值并且复制给到egg对象
    print('玩家的名称:',egg.name)                     #输出人物昵称
    print('玩家攻击力:',egg.aggressivity)             #输出人物攻击力
    print('玩家生命值:',egg.life_value)               #输出人物生命值
    
    class Dog:
        role = 'dog'
        def __init__(self,name,breed,aggressivity,life_value):
            self.name = name
            self.breed = breed
            self.aggressivity = aggressivity
            self.life_value = life_value
    
        def bite(self,people):
            '''狗可以咬人,这里的狗也是一个对象
            狗咬人,那么人的生命值就会根据狗的攻击力而下降'''
            self.life_value -= self.aggressivity
    ha2 = Dog('sunny','Hatchie ',200,800)      #创造了一只实实在在的狗
    print('动物的名字:',ha2.name)
    print('动物的品种:',ha2.breed)
    print('动物的攻击力:',ha2.aggressivity)
    print('动物的生命值:',ha2.life_value)
    
    print('旺财被玩家打之前的生命值:',egg.life_value)
    egg.attack(ha2)
    print('旺财被玩家打之后的生命值:',egg.life_value)
    
    print('玩家被旺财咬之前的生命值:',ha2.life_value)
    ha2.bite(egg)
    print('玩家被旺财咬之后的生命值:',ha2.life_value)

     

  • 相关阅读:
    POJ2286 The Rotation Game
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/bingpan/p/7340378.html
Copyright © 2020-2023  润新知