初始面向对象

时间:2021-05-23 17:23:12

今天我们来学习python中面向对象的相关知识,在学习面向对象之前,先来了解类的相关知识和对象的相关知识。

首先,什么是类?怎么用?我们得搞清楚

初始面向对象初始面向对象
def demo():
pass
demo()
申明一个函数
初始面向对象初始面向对象
'''
class 类名
类的文档字符串
类体

'''

class Student:
pass

申明一个类
class Person:
'''
申明一个具体的人类
''‘
role='person'
def __init__(self,name,life_value,aggr):
self.name=name
self.life_value=life_value
self.aggr=aggr
def attack(self):
print('攻击')

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

属性引用(类名 属性) 具体操作如下,

class cat:
role
='anminal'
def bark(self):
print('the cat can bark...')

print(cat.role)
print(cat.bark)

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

初始面向对象初始面向对象
class cat:  #定义一个猫类
role='anminal' #猫的角色是动物
def __init__(self,name,breed,color):
self.name
=name #每一个角色都有自己的名字
self.breed=breed
self.color
=color
def bark(self): #猫有叫的这种方法
print('the cat can bark...')

print(cat.role) #查看猫的role属性
print(cat.bark) #引用方法,注意不是在调用
实例化-----猫类

实例化过程实际上就是类——->对象的转化过程

对象名=类名(参数)

cat1=Cat('carfield')  #类名()就等于在执行Cat.__init__()
#
执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。

查看属性&调用方法

print(cat1.name)  
#查看属性直接对象名.属性
print(cat1.bark())
#查看调用方法 直接对象名.方法名

注:关于self,在实例化时自动将对象或者实例本身传递给__init__的第一个参数,你也可以改变其名字,但尽量不要这么做。

在这里我们需要对学的面向对象做一个小结:

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

初始面向对象初始面向对象
class 类名:
def __init__(self,参数1,参数2):
self.对象的属性1
= 参数1
self.对象的属性2
= 参数2

def 方法名(self):pass

def 方法名2(self):pass

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

对象之间的交互

  首先创造一个人类,然后在创造一个狗类,给狗类给一个方法为bark,接下来人和狗就可以打架了,以人狗大战为例,具体代码如下:   

初始面向对象初始面向对象
class Person:
'''
这是一个游戏里人物的数据类型
'''
role
= '中国人' #类属性—— 静态属性
def __init__(self,name,life_value,aggr):
self.name
= name #名字 #对象属性
self.life_value = life_value #生命值 对象属性
self.aggr = aggr #攻击力 对象属性
def attack(self,enemy): #攻击方法——动态属性
enemy.life_value = enemy.life_value - self.aggr
print(Person.__doc__)
class Dog:
def __init__(self,name,breed,aggr,life_value):
self.nickname
= name #昵称
self.breed = breed #品种
self.aggr = aggr #攻击力
self.life_value = life_value #生命值
def bite(self,person): #
person.life_value = person.life_value - self.aggr

egg
= Person('egon',1000,50)
alex
= Person('alex',250,5)
wangcai
= Dog('哈士奇','牛头梗',30,20000)

egg.money
= 200
print(egg.money)

class Weapon: #武器类
def __init__(self,name,aggr,life_value,price,attack_force):
self.price
= price
self.name
= name
self.aggr
= aggr #伤害加成
self.life_value = life_value #生命加成
self.attack_force = attack_force #攻击力
def update(self,person): #带装备,人
person.money = person.money - self.price
person.aggr
= person.aggr + self.aggr
person.life_value
= person.life_value + self.life_value
def kill(self,obj): #装备:主动技能
obj.life_value = obj.life_value - self.attack_force

剑魂
= Weapon('sword_soul',50,250,199,10000)

if egg.money > 剑魂.price:
剑魂.update(egg)
egg.weapon
= 剑魂

print(wangcai.life_value)
print(egg.aggr)
egg.attack(wangcai)
print(wangcai.life_value)

egg.weapon.kill(wangcai)
print(wangcai.life_value)
egg.weapon.kill(wangcai)
print(wangcai.life_value)
人狗大战

类命名空间与对象实例的命名空间

创建一个类就会创建一个类的命名空间,用来存储类中定义的所有名字,这些名字称为类的属性。

而类有两种属性:静态属性和动态属性

  • 静态属性就是直接在类中定义的变量
  • 动态属性就是定义在类中的方法

补充:

dir(类) #返回类中的所有名字列表
isinstance(对象,类) #判断对象是否为类的实例

dir(类) #返回类中的所有名字列表
isinstance(对象,类) #判断对象是否为类的实例
print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
print(Person.__module__) #person类所在的模块
print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名
from collections import namedtuple
p
= namedtuple('Point',['x','y'])
p1
= p(1,2)
print(p.__name__)

 课后习题:

 

初始面向对象初始面向对象
#圆形类
class Circle:
def __init__(self,radius):
self.radius
= radius

def area(self):
'面积'
return self.radius **2 * 3.14

def perimeter(self):
'周长'
return self.radius * 2 *3.14

= Circle(3)
print(圆.area())
print(圆.perimeter())
圆形类