zoukankan      html  css  js  c++  java
  • python面向对象之静态属性/静态方法/类方法/组合

    继续学习,不要松懈

    #!/usr/bin/env python
    # coding:utf-8
    
    class Campus:
    
        def __init__(self,name,addr,type):
            self.Name = name
            self.Addr = addr
            self.Type = type
    
        def details(self):
            print("学样的详细信息, 名称:%s 地址:%s 类型:%s" %(self.Name,self.Addr,self.Type) )
    
    
    c1 = Campus("南京大学","江苏南京","985")
    print(c1.__dict__)
    print(Campus.__dict__)  # 注意实例字典与类的字典的区别
    
    c1.details()
    Campus.details(c1)  # 使用类去调用方法时,需要传入具体的实例参数
    
    
    #### 也推荐看看廖雪峰的教程: https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457
    
    #####
    class Room:
        clr = '可选的,默认白色'
        def __init__(self,name,owner,width,length,height):
            self.name = name
            self.owner = owner
            self.width = width
            self.length = length
            self.height = height
    
        def area(self):
            return self.width * self.length
    
        @property # 此装饰器就是负责把一个方法变成静态属性调用
        def space(self):
            return self.width * self.length * self.height
    
        @classmethod # 供类使用的方法,虽然实例也可以调用
        def colour(cls): # 此 cls 表示自动传递类名作为参数
            print("房间的色彩是",cls.clr)
    
        @staticmethod # 比喻为类的工具包. 只是名义上的归属类管理,不能使用类变量和实例变量
        def round(a,b):
            print("地板使用%s或%s"%(a,b))
    
        ## 静态属性既可以访问实例属性,又可以访问类的属性
        ##  类方法  不能访问到实例的属性
        ## 静态方法  不能访问类的属性,也不能访问实例的属性
        # self跟实例绑定, cls跟类绑定, @staticmethod 跟谁都不绑定
    
    r1 = Room('公寓','alex',9,9,2)
    r2 = Room('house','jerry',12,13,5)
    
    print(r1.area())
    print(r2.area())
    
    print("空间:",r1.space)  # 调用方法不一样了,省掉括号
    print("空间:",r2.space)  # @property的好处是封装一个属性, 使用时完全感知不到背后的逻辑
    
    Room.colour() # 跟实例没有关系,只是类调用自己的函数. 类级别的操作.
    
    Room.round('木板','瓷砖')
    r1.round("牛皮","水泥")  # 类或实例都可以调用
    
    ## 学着学着感觉到累了, 就去B站找了下以前喜欢的视频:
    ## 砖家 "你不知道的西游记" https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457
    ## 这个系列的解说真是精彩, 以前在UKu上看过, 强力推荐给刚入社会的年轻人们看看.

    组合:

    #!/usr/bin/env python
    # coding:utf-8
    
    # class Hand:
    #     pass
    #
    #
    # class Foot:
    #     pass
    #
    # #
    # class Trunk:
    #     pass
    #
    #
    # class Head:
    #     pass
    #
    #
    # class Person:
    #     def __init__(self, id_num, name):
    #         self.id_num = id_num
    #         self.name = name
    #         self.hand = Hand() # 使用小类的实例化
    #         self.foot = Foot()
    #         self.trunk = Trunk()
    #         self.head = Head()
    #
    #
    # p1 = Person('111111', 'alex')
    # print(p1.__dict__)
    
    
    
    # ## 类的组合:组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
    # ## 参考: http://www.cnblogs.com/linhaifeng/articles/7340153.html
    class School:
        def __init__(self,name,addr):
            self.name = name
            self.addr = addr
    
    
    class Course:
        def __init__(self,name,price,period,school):
            self.name = name
            self.price = price
            self.period = period
            self.school = school
    
    class Teacher:
        def __init__(self,name,age,gender,):
            self.name = name
            self.age = age
            self.gender = gender
    
    
    s1 = School("Mooc",'北京')
    s2 = School("Mooc",'上海')
    s3 = School("Mooc",'线上')
    
    
    msg = '''
        1 xx学院 新校区
        2 xx学院 老校区
        3 xx学院 网络校区
    '''
    
    while True:
        print(msg)
        menu={
            '1':s1,
            '2':s2,
            '3':s3
        }
        choice = input("选择学校:")
        school_obj = menu[choice]
    
        n_name = input("课程名:")
        n_price = input("课程价格:")
        n_period = input("课程周期:")
    
    
        new_course= Course(n_name,n_price,n_period,school_obj)
        print("课程[%s]属于[%s]学校,费用[%s]" %(new_course.name,new_course.school.name,new_course.price))

    虽然这些都是小练习,与实际生产还有很大差距,但是没有这些练习的熟练掌握,怎么能玩转实际生产呢?

    继续!

    抽象类与接口练习:

    #!/usr/bin/env python
    # coding:utf-8
    
    import abc #利用abc模块实现抽象类(没错,就叫abc)
    
    class All_file(metaclass=abc.ABCMeta): # 定义成基类
        @abc.abstractmethod  # 用装饰器的方式定义抽象方法,无需实现功能
        def read(self):
            pass # 基类方法不用实现 子类必须定义功能
        @abc.abstractmethod
        def write(self):
            pass
    
    ## 接口继承:就是定义了一个父类,规定了所有的子类必须实现父类的方法,但是父类不实现。并不是为了节省代码
    
    ## 子类继承时必须实现具体地实现基类规定的方法,不实现就办法实例化
    class Disk(All_file):
        def read(self):
            print("disk read")
    
        def write(self):
            print("disk write")
    
    
    class Mem(All_file):
        def read(self):
            print("mem read")
    
        def write(self):
            print("mem write")
    
    class cdrom(All_file):
        def read(self):
            print("cd read")
    
        def write(self):
            print("burn cd")
    
    
    cd1 = cdrom() # 如果 cdrom没有去实现write方法,实例化时就会报错
    
    
    '''
    
    
    参考: http://www.cnblogs.com/linhaifeng/articles/7340153.html
    
    抽象类与接口
    
    抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。
    
    抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 
    '''
  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/frx9527/p/python_oop.html
Copyright © 2011-2022 走看看