类命名空间与对象、实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
而类有两种属性:静态属性和动态属性
- 静态属性就是直接在类中定义的变量 #只要使用静态属性,就用类名去调用,全局生效
- 动态属性就是定义在类中的方法
其中类的数据属性是共享给所有对象的
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
例1:写一个类,能统计这个类被多少个对象实例化了.
所有的对象共享这个结果
定义静态变量
class SS: count=0 def __init__(self): SS.count+= 1 shili1=SS() shili2=SS() shili3=SS() print(SS.count)
例2:
圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用
from math import pi class Circle: def __init__(self,r): self.r=r def area(self): return pi*(self.r**2) def perimeter(self): return 2*pi*self.r r10=Circle(10) #实例化圆环 area1=r10.area() #计算圆面积 perimeter1=r10.perimeter() #计算圆周长 print(area1,perimeter1) class Ring: def __init__(self,r_out,r_in): self.r_out=Circle(r_out) self.r_in=Circle(r_in) def area(self): ring_area=self.r_out.area()-self.r_in.area() return ring_area def perimeter(self): ring_perimeter = self.r_out.perimeter() + self.r_in.perimeter() return ring_perimeter ring=Ring(10,5) #实例化一个环 r_a=ring.area() #计算环的面积 r_p=ring.perimeter() #计算环的周长 print(r_a) print(r_p)
例3:
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python课程
参考:
class Birthday: def __init__(self,year,month,day): self.year = year self.month = month self.day = day class Teacher: def __init__(self,name,sex,course,birth): self.name = name self.sex = sex self.course = course self.birth = birth # birth是一个对象 birth = Birthday(1960,3,7) # birth 是Birthday类的一个对象 alex = Teacher(‘alex‘,‘male‘,‘python‘,birth) # alex.birth = birth # time ‘1960-3-7‘ # 老师的年龄 2018 - 1960 print(birth) import time if birth.month == time.localtime().tm_mon and birth.day == time.localtime().tm_mday: print(‘生日快乐‘) print(time.localtime().tm_year - birth.year)
实践:
class Birthday: def __init__(self,year,month,day): self.year=year self.month=month self.day=day class Teacher: def __init__(self, name, sex, course,birth): self.name=name self.sex=sex self.course=course self.birth=birth birth=Birthday(1987,6,17) zhang=Teacher(‘zhang‘,‘男‘,‘python‘,birth) print(birth) print(zhang.birth.day)
例4:
人狗大战-武器版
class Person(): #定义玩家
def __init__(self,name,aggress,hp,money): #定义对象的各种属性 self.name=name self.aggress=aggress self.hp=hp self.money=money def attack(self,dog): dog.hp-=self.aggress #狗被攻击后的血量 class Dog(): def __init__(self,name,kind,aggress,hp): #定义狗的各种属性 self.name=name self.kind=kind self.aggress = aggress self.hp = hp def bite(self,persons): #人被狗咬后的血量 persons.hp-=self.aggress class Weapen: def __init__(self,name,price,aggress,hp): #定义武器的各种属性 self.name = name self.aggress = aggress self.hp = hp self.price = price def update(self,man): #装载武器后添加属性 man.money-=self.price man.aggress+=self.aggress man.hp+=self.hp def skill(self,obj): #武器技能,被攻击者血量-500 obj.hp-=500 player=Person(‘王大锤‘,200,3000,8800) #实例化一个玩家 hei_2=Dog(‘哮天犬‘,‘狼狗‘,300,1500) #实例化一条狗 brick=Weapen(‘板砖‘,5000,300,1000) #实例化一件武器 if player.money>=brick.price: brick.update(player) player.weapen=brick print(‘玩家的剩余金钱为%d,玩家的血量为%d,玩家的攻击力为%d‘%(player.money,player.hp,player.aggress)) print(‘哮天犬的血量为%d‘%hei_2.hp) player.attack(hei_2) brick.skill(hei_2) print(‘当玩家用武器攻击哮天犬后,哮天犬的血量为%d‘%hei_2.hp)