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的血量
原文地址:https://www.cnblogs.com/zhuzhaoyang/p/8516645.html