Python-类的命名空间-组合

今日内容:(类的命名空间和组合)

一、类的命名空间:

对于类的静态属性:

  如果类.属性  调用的就是类中的属性

  对象.属性     先从自己的内存空间里找名字,找到了就用自己的,没找到用类的,如果类里没有,就会报错。

关于类的动态属性(方法):

  这个方法本身就存在类中,并不会存在对象的内存中

  但是在对象调用类中的方法的时候,要依赖于一个地址簿去类中寻找对应的方法

关于对象的属性:

  对象的属性就存在对象的命名空间中,只能被对象调用、修改,不能被类调用。

# 例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)
View Code

实例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)
View Cod

 

转载于:https://www.cnblogs.com/chengdajing/articles/7528078.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值