今日内容:(类的命名空间和组合)
一、类的命名空间:
对于类的静态属性:
如果类.属性 调用的就是类中的属性
对象.属性 先从自己的内存空间里找名字,找到了就用自己的,没找到用类的,如果类里没有,就会报错。
关于类的动态属性(方法):
这个方法本身就存在类中,并不会存在对象的内存中
但是在对象调用类中的方法的时候,要依赖于一个地址簿去类中寻找对应的方法
关于对象的属性:
对象的属性就存在对象的命名空间中,只能被对象调用、修改,不能被类调用。
# 例1
class A:
country = '印度'
def show_name(self):
print(self.name)
a = A() # 实例化对象
a.name = 'alex' # 给对象创建一个name属性
a.show_name() # 调用了showname方法
# 例2 class A: country = '印度' def show_name(self): print(self.name) a = A() a.name = 'alex' a.show_name = 'egon' a.show_name() # 报错
# 例3: class A: country = '印度' def show_name(self): print(self.name) a = A() # a对象 b = A() # b对象 # print(A.country) # print(a.country) # print(b.country) a.country = '中国' print(A.country) print(a.country) print(b.country)
二、组合
软件重用的重要方式除了继承之外还有另外一种方式,即:组合
组合指的是,在一个类中以另外一类的对象作为数据属性,称为组合。
实例:计算圆环的面积和周长
# Ring # 圆环的属性:大圆半径和小圆半径 from math import pi class Circle: def __init__(self,r): self.r = r def area(self): return self.r * self.r * pi def permeter(self): return self.r * 2 * pi class Ring: # 组合表达的是 什么有什么的 一种关系 # 组合增强了代码的重用性 def __init__(self,r_out,r_in): self.c_out = Circle(r_out) self.c_in = Circle(r_in) def area(self): return self.c_out.area() - self.c_in.area() def permeter(self): return self.c_out.permeter() + self.c_in.permeter() r1 = Ring(10,5) print(r1.area()) print(r1.permeter())
实例2.课程


class Birthday:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day
#课程类
# 课程的名字
# 课程的周期
# 授课的老师
# 课程的价格
class Course:
def __init__(self,name,period,teacher,price):
self.name = name
self.period = period
self.teacher = teacher
self.price = price
class Person:
def __init__(self,name,birth_obj,kecheng):
self.name = name
self.birtday = birth_obj
bith_hai = Birthday(1988,11,11)
py = Course('python',6,'jingdao',19800)
zhangsan = Person('张三',bith_hai,py)
print(zhangsan.name)
print(zhangsan.birtday.year)
zhangsan.kecheng = py
print(zhangsan.kecheng.name)
实例3。(人狗大战)


class Person: def __init__(self,name,sex,aggr,blood): self.name = name self.sex = sex self.aggr = aggr self.blood = blood self.money = 0 def attack(self,dog): dog.blood -= self.aggr def equip(self,weapon): self.money = weapon.price self.weapon = weapon def user_weapon(self,dog): self.weapon.hurt(dog) self.blood += self.weapon.back_blood class Dog: def __init__(self,name,kind,aggr,blood): self.name = name self.kind = kind self.aggr = aggr self.blood = blood def bite(self,person): person.blood = self.aggr class Weapon: def __init__(self,name,attack,price,back_blood): self.name = name self.attack = attack self.price = price self.back_blood = back_blood def hurt(self,dog): dog.blood -= self.attack egon = Person('egon','不详',250,380) alex = Person('alex','不详',20,40000) dog = Dog('egg','藏獒',500,20000) # 加武器 dubaozi = Weapon('毒包子',10000,200,300) egon.money = 200 if egon.money >= dubaozi.price: # egon 就装备了武器 egon.equip(dubaozi) egon.user_weapon(dog) print(egon.blood) print(dog.blood)