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),而接口只强调函数属性的相似性。
    
    抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 
    '''
  • 相关阅读:
    ASP.NET面试资料【六】
    让Google帮你托管AJAX库
    JavaScript:prototype属性使用说明【转】
    如何存储Session
    给HyperLink控件连接资源文件
    Atcoder Regular Contest 096 D Sweet Alchemy(贪心+多重背包)
    NOI2021 去不了记
    一个测试你的浏览器支持多少HTML5元素的网站
    json怎么读
    QT元件(QTableView、QSql*之类)的最好开在堆空间中用指针操作
  • 原文地址:https://www.cnblogs.com/frx9527/p/python_oop.html
Copyright © 2011-2022 走看看