23、类和对象的命名空间、组合

1、创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

  类有两种属性:静态属性和动态属性

  1)、静态属性就是直接在类中定义的变量。

  2)、动态属性就是定义在类中的方法。

  • 首先定义一个类:
    
    class Course:
        language=['chinese']                    #静态属性
        def __init__(self,name,course_name,period,price):   #动态属性
            self.name=name
            self.course_name=course_name
            self.period=period
            self.price=price
        def func(self):
            pass
    Course.__dict__['language']= 'english'        #__dict__修改不了类中的静态变量(不可变数据类型)
    Course.language='english'                      #对于不可变数据类型来说,类变量最好用类名操作
    print(Course.language)
    
    python=Course('egon','python',6,20000)
    print(python.language)                           #类中的静态变量,可以被对象和类调用
    
    
    python.language[0]='enn'                       # 对于可变数据类型来说,对象名的修
    print(Course.language)                         #改是共享的,重新赋值是独立的
    python.language='germon'
    print(Course.language)



 

2、创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,成为对象/实例的属性

  在obj.name会首先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就去父类。。。最后都找不到就会抛出异常。

 


组合

什么是组合?

  一个对象的属性值是另一个类的对象(太他么的复杂了……)

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
class Ring:                             #定义圆环
    def __init__(self,outside_r,inside_r):     #圆环的属性
        self.outside_r=Circle(outside_r)  #圆环的属性是圆的对象
        self.inside_r=Circle(inside_r)
    def area(self):
        return self.outside_r.area()-self.inside_r.area()
    def perimeter(self):
        return self.outside_r.perimeter()+self.inside_r.perimeter()

a=Circle(6)              #实例化
print(a.area())
print(a.perimeter())
b=Circle(2)
print(b.area())
print(b.perimeter())

c=Ring(6,2)
print(c.area())
print(c.perimeter())

 

posted @ 2018-01-22 08:28  王二黑  阅读(217)  评论(0编辑  收藏  举报