zoukankan      html  css  js  c++  java
  • python 面向对象的命名空间及类的组合

    一.命名空间

    class Person:
        Country = '中国人'   # 静态变量
    
    print(Person.Country)    #类名.静态变量
    alex = Person()         #创建一个空的命名空间
    alex.name = 'alex'     #对象.属性名
    alex.Country = '泰国人'
    
    # 类名可以调用对象的属性么?   不可以
    # 对象可以调用类中的属性么?  可以
    # 由于对象和类之间存在一个关联关系
    # 所以对象能够找到类
    # 但是 类不能找到对象
    
    print(Person.Country)   #中国人
    print(alex.Country)    #泰国人

    二.对象.属性命名空间寻找(先在自己命名空间找,后再类命名空间找)

    使用类名.属性 只会寻找类中的静态变量名字
    使用对象.属性 会现在对象自己的命名空间中找名字。如果找不到再到类的内存空间中去找

    # 只要你使用静态变量  就用类名去调用
    class Person:
        money = 0
    
    mother = Person()
    father = Person()
    Person.money += 1000
    Person.money += 1000
    print(mother.money)    #2000
    print(father.money)    #2000
    print(Person.money)    #2000
    
    
    class Person:
        money = [0]
    mother = Person()
    father = Person()
    mother.money[0] += 1000
    father.money[0] += 1000
    print(mother.money)     #[2000]
    print(father.money)     #[2000]
    print(Person.money)    #[2000]
    # 注意:[0]中0表示索引值所在的空间,+= 1000 就是变化索引值。
    
    
    class Person:
        money = [0]
    mother = Person()
    father = Person()
    mother.money = [1000]
    father.money = [2000]
    print(mother.money)    #[1000]
    print(father.money)    #[2000]
    print(Person.money)   #[0]

    三. 写一个类,能统计这个类被多少个对象实例化了,所有的对象共享这个结果,init 静态变量

    class Foo:
        num = 0
        def __init__(self):
            Foo.num += 1
    
    f1 = Foo()
    print(Foo.num)   # 1
    f2 = Foo()
    print(Foo.num)  # 2
    print(f1.num)    #  2

    四.组合

    组合 :两个类的事儿
    什么叫组合 : 一个类对象的属性 是 另外一个类的对象
    两个类的事儿 :类与类之间有一种"什么有什么的关系"

    1.圆环的面积计算

    #圆是一个类   属性是半径

    # 圆环 也是一个类
    # 属性 大圆半径 和 小圆半径
    # 圆环 求面积 求周长

    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
    
    # c1 = Circle(5)
    # c2 = Circle(2)
    
    class Ring:
        def __init__(self,outer,inner):
            self.outer = Circle(outer)
            self.inner = Circle(inner)
        def area(self):
            return self.outer.area()-self.inner.area()
        def perimeter(self):
            return self.outer.perimeter() + self.inner.perimeter()
    
    r = Ring(10,5)
    print(r.area())         #235.61944901923448
    print(r.perimeter())   #94.24777960769379

    2.老师,生日组合

    class Birthday:
        def __init__(self,year,mouth,day):
            self.year = year
            self.mouth = mouth
            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(1980,8,21)
    alex = Teacher('alex','female','python',birth)
    # print(alex.birth)
    # print(alex.birth.year)
    
    import time
    t = time.localtime()
    if t.tm_mon == alex.birth.mouth and t.tm_mday == alex.birth.day:
        print('生日快乐')
    print(time.localtime().tm_year - birth.year)

    3.人狗大战加装备版

    class Weapon:
        def __init__(self,name,price,aggr,protect):
            self.name = name
            self.price = price
            self.aggr = aggr
            self.protect = protect
    
        def kill(self,dog):   # 技能
            print('使用%s的必杀技,打中%s'%(self.name,dog.name))
            dog.hp -= self.aggr
            print('%s的生命值减少%s,剩余%s'%(dog.name,self.aggr,dog.hp))
    
    class Person:    # 类名 Person
        role = ''  # 类的静态变量 是所有的对象共享的一个属性
        def __init__(self,name,sex,aggr,hp):  #方法 动态属性  内置的双下方法
            self.name = name    # 对象属性 实例属性
            self.sex = sex
            self.aggr = aggr
            self.hp = hp
        def attack(self,dog):  # 自定义方法
            print('%s打了%s'%(self.name,dog.name))
            dog.hp -= self.aggr
    
    class Dog:
        def __init__(self,name,kind,aggr,hp):
            self.name = name   # 对象属性
            self.kind = kind
            self.aggr = aggr
            self.hp = hp
        def bite(self,person):
            print('%s咬了%s'%(self.name,person.name))
            person.hp -= self.aggr
    
    weapon = Weapon('屠龙宝刀',20000,999,0)
    alex = Person('alex','female',1,250)
    hei = Dog('小黑','teddy',260,10000)
    alex.attack(hei)
    print(hei.hp)
    hei.bite(alex)
    print(alex.hp)
    ret = input('输入1可以充值复活 :')
    if ret == '1':
        money = int(input('10000元复活一次,你要充值多少钱:'))
        if money>10000:
            alex.hp = 260
            alex.money = money - 10000
            print('复活成功,当前血量%s,当前账户余额%s'%(alex.hp,alex.money))
        ret = input('输入1购买武器')
        if ret == '1':
            if alex.money >= 20000:
                alex.money -= weapon.price
                alex.weap = weapon
                print('购买成功,当前余额%s,当前武器%s'%(alex.money,alex.weap.name))
    alex.weap.kill(hei)  # alex使用武器打小黑
    hei.bite(alex)  # 小黑怒不可遏咬alex
    print(alex.hp)  # 最终查看alex的血量
  • 相关阅读:
    E
    D
    Npp ChangeLog
    c++ 书籍(zz)
    再好的工作是为了更好的生活
    如何将JPG格式的图片转换成PNG格式
    点分治
    团体程序设计天梯赛(CCCC) L3021 神坛 的一些错误做法(目前网上的方法没一个是对的) 和 一些想法
    团体程序设计天梯赛(CCCC) L3019 代码排版 方法与编译原理密切相关,只有一个测试点段错误
    团体程序设计天梯赛(CCCC) L3015 球队“食物链” 状态压缩
  • 原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8516645.html
Copyright © 2011-2022 走看看