zoukankan      html  css  js  c++  java
  • python类的命令空间

    1. 类可以定义两种属性:

           1> 静态属性:直接在类中定义的变量,是共享给所有实例对象的;

           2> 动态属性:定义在类中的方法,是绑定到所有实例对象的;

           3> 创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性;

           4> 对象/实例访问对象时,先找自己的,没有再找类的,之后再找父类的,再没有就抛错;

    class Course:
        language = ['Chinese']
        def __init__(self,teacher,course,period,price):
            self.teacher = teacher
            self.name = course
            self.period = period
            self.price = price
    
        def func(self):
            pass
    
    python=Course('egon','python','6 months',2000)
    linux=Course('amy','linux','9 months',4000)
    
    python.language = 'English'  #python实例自己增加了一个属性language
    
    print('Course.language的id:',id(Course.language))
    print('python.language的id:',id(python.language)) #新地址
    print('linux.language的id:',id(linux.language))
    print('--------------------')
    print('Course.language:',Course.language)
    print('python.language:',python.language)
    print('linux.language:',linux.language)    #linux自己没有属性language,引用了类的静态属性
    print('++++++++++++++++++++')
    print('Course.__dict__:',Course.__dict__)
    print('python.__dict__:',python.__dict__)
    print('linux.__dict__:',linux.__dict__)
    类静态属性

    2. 对于不可变数据类型,类变量最好用类操作,而不使用实例操作;

    3. 对于可变数据类型,实例名的修改是共享的(同一个命令空间),重新赋值是独立的(新的命令空间);

    class Course:
        language = ['Chinese']
        def __init__(self,teacher,course,period,price):
            self.teacher = teacher
            self.name = course
            self.period = period
            self.price = price
    
        def func(self):
            pass
    
    python=Course('egon','python','6 months',2000)
    linux=Course('amy','linux','9 months',4000)
    
    python.language[0] = 'English'    #直接修改了Course.language对象所指的列表对象['Chinese']的值修改为English
    
    print('Course.language的id:',id(Course.language))
    print('python.language的id:',id(python.language))   #引用的是Course.language对象所指的列表的值
    print('linux.language的id:',id(linux.language))     #引用的是Course.language对象所指的列表的值
    print('python.language[0]的id:',id(python.language[0])) #列表对象['Chinese']的id
    print('--------------------')
    print('Course.language:',Course.language)
    print('python.language:',python.language)
    print('linux.language:',linux.language)
    print('++++++++++++++++++++')
    print('Course.__dict__:',Course.__dict__)
    print('python.__dict__:',python.__dict__)
    print('linux.__dict__:',linux.__dict__)
    类属性修改

     

     4. 一个应用

    #创建一个类,每实例化一个对象就计数;
    #最终所有的对象共享这个数据;
    class Foo:
        count = 0
        def __init__(self):
            Foo.count +=1
    
    f1=Foo()
    f2=Foo()
    print(f1.count)
    print(f2.count)

     5. 绑定方法:实例对象调解类内的方法时,这个实例对象就和这个方法产生了绑定,即绑定方法;

    def func():
        pass
    
    class Foo():
        def func(self):
            print('func')
    
    f1=Foo()
    print(func)
    print(Foo.func)
    print(f1)  #
    print(f1.func) # f1与类Foo.func方法绑定
    绑定方法

  • 相关阅读:
    cocos进阶教程(5)回调函数和定时器的使用技巧
    lua关于参数生命周期的研究
    cocos进阶教程(5)各种动画使用心得
    Quick中require与import的区别
    【cocos2d-x 3.5】Lua动画API
    mac3.0环境搭建
    cocos-lua基础学习(10)scheduler类学习笔记
    LeetCode:搜索二维矩阵【74】
    LeetCode:搜索旋转排序数组【33】
    LeetCode:数据库技术【180-185】
  • 原文地址:https://www.cnblogs.com/quiet-sun/p/12368744.html
Copyright © 2011-2022 走看看