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)

 

原文地址:https://www.cnblogs.com/bingpan/p/7340378.html