一.命名空间
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的血量