zoukankan      html  css  js  c++  java
  • 021_面向对象的名称空间

    1,类里面  可以定义两种属性:
          静态属性
          动态属性
    class Course:
        language = 'Chinese'
        def __init__(self,teacher,course_name,period,price):
            self.teacher = teacher
            self.name = course_name
            self.period = period
            self.price = price
        def func(self):
            pass
    Course.language = 'English'             #类的静态属性只能通过对象或类这种方式修改。不能通过字典
    # Course.__dict__['language'] = 'Chinese'
    # print(Course.language) 
    2,命名空间
      2.1
    1. 类属性的命名空间是是共享的,而对象的属性命名空间,是每创建一个对象就开创一个自己的命名空间,只保存自己的对象属性,不保存类属性。各对象的命名空间相互独立。
    2. “类名.对象属性”  Course.name 是不能用的。因为类不能使用对象的属性的,对象需要类的属性时,可以向类寻找。
    3. 因为类的命名空间是各对象共享的,所以如通过“类名.类属性”修改类属性,那么依靠这个类创建的实例化对象中在调用其类属性都会相应改变。
    4. 如果,通过“对象名.类属性”则类命名空间的该类属性不会变(即共享空间的类属性不会变)但是,这个对象会将这个类属性添加到自己的命名空间,并将值修改,成为自己的对象属性。
      python = Course('egon','python','6 months',20000)
      linux = Course('oldboy','linux','6 months',20000)
      Course.language = 'Chinese'
      print(python.language)  #Chinese
      print(linux.language) #Chinese
      python.language = 'py'
      print(Course.language) #Chinese
      print(python.language) #py
      print(linux.language)   #Chinese
    2.2
    print(linux.__dict__) #查看linux对象名称空间的名称
    print(python.__dict__) #查看python对象名称空间的名称

    由此可见,python对象中多了一个属性,如果想让该属性依然跟着大众变化,就要 “del python.language”
    del python.language
    print(python.__dict__)
    2.3
    如果类属性是可变数据类型,那么通过对象修改可变数据类型中的一个元素,那么就是修改了这个可变数据类型的元素。又因为对象中找类属性,通过指向类中类属性的地址,
    类属性又指向可变数据类型,列表的地址,而修改可变数据类型中元素,并不改变可变数据类型列表的地址,因此,通过对象修改可变数据类型的元素,就更改了类属
    class Course:
    	language = ['Chinese']
    	def __init__(self,teacher):
    		self.teacher = teacher
    
    python = Course('egon')		#['Chinese']
    linux = Course('oldboy')	#['Chinese']
    python.language[0] = 'English'
    print(Course.language)		#['English']
    python = Course('egon')		#['English']
    linux = Course('oldboy') 	#['English']
    python.language = ['English']	#这样却不会修改类属性,因为这是建立一个新列表,一个新地址,和原列表没关系。
    python = Course('egon')  
    linux = Course('oldboy')
    2.4
    # 类中的静态变量 可以被对象和类调用
    # 对于不可变数据类型来说,类变量最好用类名操作
    # 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的
     
    3,认识绑定方法
    def func():pass
    print(func)
    class Foo:
        def func(self):
            print('func')
        def fun1(self):
            pass
    f1 = Foo()
    print(Foo.func)  #除了对象,其它的都不能和func形成绑定关系。
    print(f1.func)   #f1.func就是将f1与func方法绑定
    # print(f1.fun1)
    #<bound method Foo.func of f1>
    

      

    4,
      对象需要的去类里找,如果类里没有就没有,不会向全局找。
    5,
      组合 :一个对象的属性值是另外一个类的对象
     
     
     
  • 相关阅读:
    listview 加载性能优化 viewholder
    eclipse使用有感
    android常见的错误
    填充父窗体布局问题
    setTag()/getTag()
    自己动手实现自旋锁
    新手学信息检索6:谈谈二值独立模型
    自己动手编译、运行Java程序
    新手学信息检索5:正确率召回率与搜索引擎的评价
    新手学信息检索4:向量空间模型与相似度计算
  • 原文地址:https://www.cnblogs.com/eternity-twinkle/p/10550538.html
Copyright © 2011-2022 走看看