面向对象--命名空间和内存

其他

    类 : 这个类有什么属性 有什么方法 大致的样子
         不能知道具体的属性对应的值
    对象 :之前所有的属性值就都明确了
    类型 :int float str dict list tuple set -- 类(内置的数据类型,内置的类) 通过type()查看类型
    举例:
        变量名 = xx数据类型对象
        a = 10
        b = 12.5
        l = [1,2,3]
        d = {'k':'v'}
        o = 函数
        q = 迭代器
        u = 生成器
        i = 类名

    python中一切皆对象,对象的类型就是类。

    所有的对象都有一个类型,class A实例化出来的对象的类型就是A类
        123的类型是int
        
        'ajksfk'的类型是str
        
        {}的类型是dict
        
        alex = Person()的类型是Person
        
        小白 = Dog()的类型是Dog

        def abc():pass
        print(type(abc))#<class 'function'>

命名空间和内存

类中的变量是静态变量
对象中的变量只属于对象本身,每个对象有属于自己的空间来存储对象的变量
当使用对象名去调用某一个属性的时候会优先在自己的空间中寻找,找不到再去对应的类中寻找
如果自己没有就引用类的,如果类也没有就报错
对于类来说,类中的变量所有的对象都是可以读取的,并且读取的是同一份变量

类中的静态变量的用处:
如果一个变量 是所有的对象共享的值,那么这个变量应该被定义成静态变量
所有和静态变量相关的增删改查都应该使用类名来处理
而不应该使用对象名直接修改静态变量

类指针:在对象名称空间中存储了类所在的内存地址,对象总是能单向找到类,类不能找到对象。对象a的名称空间找不到,就去类A的名称空间去找。
        
    ####1:
        class A:   #class A一个缩进内的内容,不用调用就会执行。在一个缩进内不能使用A.的方式调用,因为A是最后才指向命名空间的
            Country = '中国'     # 静态变量/静态属性 存储在类的命名空间里的
            def __init__(self,name,age):  # 类内部的函数叫绑定方法 存储在类的命名空间里的
                self.name = name
                self.age = age
            def func1(self):   #self 就是一个形式参数,传什么接收什么
                print(self)
            def func2(self):pass
            def func3(self):pass
            def func4(self):pass
            def func5(self):pass

        #
        a = A('alex',83)
        # print(a)#<__main__.A object at 0x00000239DE64FB70>
        print(a.name)#alex
        print(a.Country)#中国  #类指针:存储了类所在的内存地址,对象总是能单向找到类,类不能找到对象。对象a的名称空间找不到,就去类A的名称空间去找。

        print(A.Country)#中国  一般不用类名的调用
        a.func1() # 等价于# A.func1(a)      #一般不用不用类名调用方法,用对象去调用方法
        # <__main__.A object at 0x00000239DE64FB70>

        ###:2
        class A:   #class A一个缩进内的内容,不用调用就会执行。在一个缩进内不能使用A.的方式调用,因为A是最后才指向命名空间的
            Country = '中国'     # 静态变量/静态属性 存储在类的命名空间里的
            def __init__(self,name,age):  # 类内部的函数叫绑定方法 存储在类的命名空间里的
                self.name = name
                self.age = age
            def func1(self):
                print(self)
            def func2(self):pass
            def func3(self):pass
            def func4(self):pass
            def func5(self):pass
            Country = '印度'


        print(A.Country)#印度  #注意同上面的区别
        print(A.__dict__)

        ###3:
        class A:
            Country = '中国'     # 静态变量/静态属性 存储在类的命名空间里的
            def __init__(self,name,age,country):  # 绑定方法 存储在类的命名空间里的
                self.name = name
                self.age = age
                self.Country = country
            def func1(self):
                print(self)
            def func2(self):pass
            def func3(self):pass
            def func4(self):pass
            def func5(self):pass

        a = A('alex',83,'印度')
        print(a.name)#alex
        print(a.Country)#印度  对象a的名称空间可以找到,就不去类A的名称空间取值。
        print(A.Country)#中国

        ###4:
        class A:
            Country = '中国'     # 静态变量/静态属性 存储在类的命名空间里的
            def __init__(self,name,age,country):  # 绑定方法 存储在类的命名空间里的
                self.name = name
                self.age = age
                self.Country = country   #注意大写,如果写成小写,又去找大写print(b.Country)就会是中国
            def func1(self):
                print(self)
            def func2(self):pass
            def func3(self):pass
            def func4(self):pass
            def func5(self):pass

        a = A('alex',83,'印度')
        b = A('wusir',74,'泰国')
        a.Country = '日本'  #属性的修改
        print(a.Country)#日本
        print(b.Country)#泰国
        print(A.Country)#中国

        ###5:
        class A:
            Country = '中国'     # 静态变量/静态属性 存储在类的命名空间里的
            def __init__(self,name,age,country):  # 绑定方法 存储在类的命名空间里的
                self.name = name
                self.age = age
            def func1(self):
                print(self)
            def func2(self):pass
            def func3(self):pass
            def func4(self):pass
            def func5(self):pass

        a = A('alex',83,'印度')
        b = A('wusir',74,'泰国')
        A.Country = '日本'  #静态变量的修改,通过类名来处理
        print(a.Country)#日本   #a = A('alex',83,'印度')虽然传入了参数,但是在对象a的名称空间中没有定义变量,没有此句self.Country = country
        print(b.Country)#日本
        print(A.Country)#日本

        ####6:

        class A:pass
        A.Country = 123   # 属性的增加
        print(A.Country)  #123  查看或者引用

        # 实现一个类,能够自动统计这个类实例化了多少个对象
        class A:
            count = 0  #静态变量
            def __init__(self):
                A.count += 1   #每次实例化对象就+1    注意在一个缩进内不能使用 A.方式

        a1 = A()
        print(a1.count)#1   对象a1的名称空间找不到,就去类A的名称空间取值。
        a2 = A()
        print(A.count)#2   #静态变量的查看,通过类名来处理

组合

###组合:一个类的对象是另外一个类对象的属性。作用:方便代码修改,让代码更加灵活

        学生类
            姓名 性别 年龄 学号 班级 手机号
        班级信息
            班级名字
            开班时间
            当前讲师

        class Student:
            def __init__(self,name,sex,age,number,clas,phone):
                self.name = name
                self.sex = sex
                self.age = age
                self.number = number
                self.clas = clas
                self.phone = phone
        class Clas:
            def __init__(self,cname,begint,teacher):
                self.cname = cname
                self.begint = begint
                self.teacher = teacher

        # 查看的是大壮的班级的开班日期是多少
        # 查看的是雪飞的班级的开班日期是多少
        py22 = Clas('python全栈22期','2017-4-26','小白')
        py23 = Clas('python全栈23期','2017-5-28','宝元')

        大壮 = Student('大壮','male',18,27,py23,13812012012)
        雪飞 = Student('雪飞','不详',18,17,py22,13812012013)

        print(大壮.clas,py23)#二者是同一个<__main__.Clas object at 0x000002749D66FA20> <__main__.Clas object at 0x000002749D66FA20>
        print(py23.begint)#2017-5-28
        print(大壮.clas.begint)#2017-5-28

        print(py22.begint)#2017-4-26
        print(雪飞.clas.begint)#2017-4-26





        练习 :
        对象变成了一个属性
        班级类
            包含一个属性 - 课程
        课程
            课程名称
            周期
            价格
        ###1:
        class Clas:  #班级
            def __init__(self,cname,begint,teacher,course):
                self.cname = cname
                self.begint = begint
                self.teacher = teacher
                self.course = course  #课程

        class Course:  #课程
            def __init__(self,name,period,price):
                self.name = name
                self.period = period
                self.price = price

        python = Course('python22','6个月',21800)

        py22 = Clas('python全栈22期','2017-4-26','小白',python)
        print(py22.course.price)#21800
        print(python.price)#21800

        ##2:
        class Clas:
            def __init__(self,cname,begint,teacher):
                self.cname = cname
                self.begint = begint
                self.teacher = teacher

        class Course:
            def __init__(self,name,period,price):
                self.name = name
                self.period = period
                self.price = price

        python = Course('python22','6个月',21800)

        py22 = Clas('python全栈22期','2017-4-26','小白')
        py22.clas = python   #属性的增加  注意同上面的区别
        print(py22.clas.price)#21800
        print(python.price)#21800

        ##3:
        class Clas:
            def __init__(self,cname,begint,teacher):
                self.cname = cname
                self.begint = begint
                self.teacher = teacher
        class Course:
            def __init__(self,name,period,price):
                self.name = name
                self.period = period
                self.price = price
        py22 = Clas('python全栈22期','2019-4-26','小白')
        linux57 = Clas('linux运维57期','2019-3-27','李导')
        linux58 = Clas('linux运维58期','2019-6-27','李导')

        python = Course('python','6 months',21800)
        linux = Course('linux','5 months',19800)

        linux57.course = linux
        linux58.course = linux
        print(linux57.course.price)#19800
        print(linux58.course.price)#19800

        py22.course = python
        print(py22.course.period)#6 months


        linux.price = 21800
        print(linux57.course.price)#21800
        print(linux58.course.price)#21800

        ##4:
        自(测试):
        class Clas:
            def __init__(self,cname,begint,teacher,cperiod,cprice):
                self.cname = cname
                self.begint = begint
                self.teacher = teacher
                self.cprice = cprice  # 课程价格
                self.cperiod = cperiod  # 课程周期

        class Course:
            def __init__(self,name,period,price):
                self.name = name
                self.period = period  # 课程周期
                self.price = price  #课程价格


        linux = Course('linux', '5 months', 19800)
        linux.price = 21800  #修改此处,所有课程价格统一修改
        linux57 = Clas('linux运维57期','2017-3-27','李导',linux.period,linux.price)
        linux58 = Clas('linux运维58期','2017-4-27','王导',linux.period,linux.price)
        linux59 = Clas('linux运维59期','2017-5-27','张导',linux.period,linux.price)
        linux60 = Clas('linux运维60期','2017-6-27','马导',linux.period,linux.price)
        linux61 = Clas('linux运维61期','2017-7-27','赵导',linux.period,linux.price)

        print(linux57.cprice)#21800
        print(linux58.cprice)#21800
        print(linux59.cprice)#21800

猜你喜欢

转载自www.cnblogs.com/xiaomage666/p/10957950.html