一、Python类的名称空间
class Student(object):
School = '北京大学'
def __init__(self):
pass stu1 = Student()
stu1.name = '小明'
print(stu1.School)
print(Student.name) #error type object 'Student' has no attribute 'name'
1.类可以调用对象的属性吗?
2.对象可以调用类属性吗?
通过上面的代码可以看出,类无法访问对象的属性,由于对象和类之间存在一个关联关系,所以对象能够找到类。
使用类名.属性名,只能寻找类中的静态属性名
使用对象.属性名,现在对象自己的名称空间内找,如果找不到,再到类的内存空间找。
对象修改类的静态属性
我们想象一个场景:妈妈和爸爸工作挣钱,然后把钱放在钱箱里,供一个家庭使用:
class Person(object):
Home_Money = 0
def __init__(self):
pass mother = Person()
mother.Home_Money += 1000
father = Person()
father.Home_Money += 1000 print(mother.Home_Money) #
print(father.Home_Money) #
print(Person.Home_Money) #
通过上面代码,Person中的Home_Money还是0,这是因为 对象.属性名 = 1000 是赋值操作,只是给对象添加了一个属性,并没有修改Person中静态属性。
如果我们把 Home_Money设置成list,结果将会不同
class Person(object):
Home_Money = [0]
def __init__(self):
pass mother = Person()
mother.Home_Money[0] += 1000
father = Person()
father.Home_Money[0] += 1000 print(mother.Home_Money) #2000
print(father.Home_Money) #
print(Person.Home_Money) #
只要使用静态属性,就必须使用类名去调用,尽量不要使用对象名。
#统计一个类被实例化次数
class Person():
count = 0
def __init__(self):
Person.count += 1 alex = Person()
egon = Person()
xiaoming = Person()
laowang = Person() print('实例化次数:%s' %Person.count)
二、对象组合
求圆环的面积
from math import pi
class Ring():
def __init__(self,R,r):
self.R = R
self.r = r
def area(self):
return pi*(self.R**2) - pi*(self.r**2) def perimeter(self):
return 2*pi*self.R + 2*pi*self.r
ring = Ring(10,5)
print(ring.area()) #235.61944901923448
print(ring.perimeter()) #94.24777960769379
使用对象组合重写写一遍求圆环的面积和周长
class Ring():
def __init__(self,out,inner):
self.out = Circle(out) # 一个类的对象属性 = 另一个类的对象
self.inner = Circle(inner)
def area(self):
return self.out.area() - self.inner.area() def perimeter(self):
return self.out.perimeter() + self.inner.perimeter()
ring = Ring(10,5)
print(ring.area())
print(ring.perimeter())
什么时候使用面向对象组合: 类与类之间有一种"什么有什么的关系" --> 圆环里有,学生类中与生日类,人物拥有xx装备等