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.类能够调用对象的属性吗?python
2.对象能够调用类属性吗?spa
经过上面的代码能够看出,类没法访问对象的属性,因为对象和类之间存在一个关联关系,因此对象可以找到类。code
使用类名.属性名,只能寻找类中的静态属性名对象
使用对象.属性名,如今对象本身的名称空间内找,若是找不到,再到类的内存空间找。blog
咱们想象一个场景:妈妈和爸爸工做挣钱,而后把钱放在钱箱里,供一个家庭使用:内存
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) #1000 print(father.Home_Money) #1000 print(Person.Home_Money) #0
经过上面代码,Person中的Home_Money仍是0,这是由于 对象.属性名 = 1000 是赋值操做,只是给对象添加了一个属性,并无修改Person中静态属性。it
若是咱们把 Home_Money设置成list,结果将会不一样class
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) #2000 print(Person.Home_Money) #2000
只要使用静态属性,就必须使用类名去调用,尽可能不要使用对象名。import
#统计一个类被实例化次数 class Person(): count = 0 def __init__(self): Person.count += 1 alex = Person() egon = Person() xiaoming = Person() laowang = Person() print('实例化次数:%s' %Person.count)
求圆环的面积object
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装备等