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,
      组合 :一个对象的属性值是另外一个类的对象
     
     
     
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/eternity-twinkle/p/10550538.html
Copyright © 2011-2022 走看看