zoukankan      html  css  js  c++  java
  • 继续面向对象之成员与组合

    成员:(3类)

    1.变量:    实例变量与类变量

    实例变量:包含公有实例变量(字段)和私有实例变量(字段)  区别在于"__"

    类变量:也包含公有类变量和私有类变量(静态字段) 区别也在于__

    总结:  A准则:实例变量(字段)访问时,直接使用对象访问,即:obj.name

          类变量(静态字段)访问时,使用类方法,即:Foo.country(实在不方便时,才使用对象方法                      (ob j.country))
              B易错点:a 创建对象时,传入的参数和原对象中的参数不在同一空间    

      
    class Foo:
        country='china'
        def __init__(self,name):
            self.name=name
        def func(self):
            ...
    obj=Foo('america')
    obj1=Foo('美国')
    print(obj.name)  #结果为america
    print(obj1.name)# 结果为 美国
    View Code

      B易错点:b 在外部更改(obj.country='中华人民共和国')相当于给局部空间中添加了一个obj.country='中华人民共和国'变量 对类变量没有影响

    class Foo:
        country='china'
        def __init__(self,name):
            self.name=name
        def func(self):
            ...
    obj=Foo('america')
    obj1=Foo('美国')
    print(Foo.country)  #结果为 china
    print(obj.country)  #结果为 china
    print(obj1.country)# 结果为 china
    obj.country='中华人民共和国'
    print(obj.country)  #结果为 中华人民共和国
    print(obj1.country) # 结果为 china
    View Code

    总结 :1外部无法调用私有类变量,如果想在外部调用显示内部私有变量,可通过熟人(即内部方法)得到(不推荐)2 儿子都不知道的事:即私有变量可在内部被函数类方法调用,但是如果存在父子类对象 在派生类中是无法调用基类中的私有变量的.

    2方法 : 实例方法 静态方法 类方法 

    实例方法:  私有实例方法:在外部无法访问

    class Foo:
    
        def __init__(self,name):
    
            self.name=name
    
        #实例方法(存在的必要性调用self中内容)
    
        def func(self):
    
                print(self.name)
        #静态方法,如果方法无法使用对象中封装的值,就可使用静态方法
        @staticmethod
        def display(a1,a2):
            return a1+a2
    obj=Foo('金角大王')
    obj.func() #结果为金角大王
    obj1 = Foo.display(3,1)
    
    print(obj1)  #结果为4
    View Code

    静态方法:  私有静态方法:在外部调用时会报错

         1编写时,上方写@staticmethod  参数可有可无

         2 调用时,   **推荐使用  类.方法名(参数(可有可无))   *不推荐  对象.方法名()

          3静态方法存在必要:无需调用对象中封装的值.

    类方法:  1 定义时, 上方写@classmethod,至少有一个cls参数

        2执行时, 类名.方法名()  默认会将当前类传到参数中

        3何时使用?如果方法中或使用到当前类,就可以使用类方法

    class Foo(object):
        def __init__(self, name):
            self.name = name
    
        # 实例方法,self是对象
        def func(self):
            print(self.name)
    
        # 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
        @staticmethod
        def display(a1,a2):
            return a1 + a2
    
        # 类方法,cls是类
        @classmethod
        def show(cls,x1,x2):
            print(cls,x1,x2)
    
    # 执行类方法
    Foo.show(1,8)

    3属性:通过方法改造出来

      1编写时 上方写@property  只有一个self参数

      2调用时:无需加括号 直接  对象.方法 调用

      3应用场景:对于简单的方法,当无需传值且有返回值时

    示例:

    class Foo(object):
    class Foo(object):
        def __init__(self):
            pass
    
        @property
        def start(self):
            return 1
    
        @property
        def end(self):
            return 10
    
    obj = Foo()
    print(obj.start)
    print(obj.end)            

    练习题:

    翻页问题

    # 以前写法
    # data_list = []
    #
    # for i in range(1, 901):
    #     data_list.append('alex-%s' % i)
    #
    # while True:
    #     # 1. 要查看的页面
    #     page = int(input('请输入要查看的页码:'))
    #
    #     # 2. 每页显示 10 条
    #     per_page_num = 10
    #
    #     start = (page-1) * per_page_num
    #     end = page * per_page_num
    #
    #     page_data_list = data_list[start:end]
    #     for item in page_data_list:
    #         print(item)
    
    
    class Pagenation(object):
        """
        处理分页相关的代码
        """
    
        def __init__(self,page,per_page_num=10):
            """
            初始化
            :param page: 当前要查看的页面
            :param per_page_num: 每页默认要显示的数据行数
            """
            self.page = page
            self.per_page_num = per_page_num
    
        @property
        def start(self):
            """
            计算索引的起始位置
            :return:
            """
            return (self.page-1) * self.per_page_num
    
        @property
        def end(self):
            """
            计算索引的结束位置
            :return:
            """
            return self.page * self.per_page_num
    
    
    
    data_list = []
    
    for i in range(1, 901):
        data_list.append('alex-%s' % i)
    
    while True:
        # 1. 要查看的页面
        page = int(input('请输入要查看的页码:'))
    
        obj = Pagenation(page)
        page_data_list = data_list[obj.start:obj.end]
        for item in page_data_list:
            print(item)
    制作翻页
    class Pagenation(object):
        """
        处理分页相关的代码
        """
    
        def __init__(self,data_list,page,per_page_num=10):
            """
            初始化
            :param data_list: 所有的数据
            :param page: 当前要查看的页面
            :param per_page_num: 每页默认要显示的数据行数
            """
            self.data_list = data_list
            self.page = page
            self.per_page_num = per_page_num
    
        @property
        def start(self):
            """
            计算索引的起始位置
            :return:
            """
            return (self.page-1) * self.per_page_num
    
        @property
        def end(self):
            """
    翻页制作优化版

    附送:嵌套了解

    ""
    创建三个学校且三个学校的设施内容等都是一致.
    """
    
    class School(object):
        def __init__(self, name, address):
            self.name = name
            self.address = address
    
        def speech(self):
            print('讲课')
    
    obj1 = School('老男孩北京校区', '美丽富饶的沙河')
    obj2 = School('老男孩上海校区', '浦东新区')
    obj3 = School('老男孩深圳校区', '南山区')
    class Teacher(object):
        def __init__(self, name, age, salary):
            self.name = name
            self.age = age
            self.__salary = salary
            self.school = None
    
    t1 = Teacher('李杰', 19, 188888)
    t2 = Teacher('艳涛', 18, 60)
    t3 = Teacher('女神',16, 900000)
    # ############## 老师分配校区
    t1.school = obj1
    t2.school = obj1
    t3.school = obj2
    # ####################################
    # 查看t1老师,所在的校区名称/地址
    print(t1.school.name)
    print(t1.school.address)
    print(t1.name)
    print(t1.age)
    t1.school.speech()
    嵌套练习
  • 相关阅读:
    关于89S51单片机数码管显示的小工具
    重新启动IIS的小工具
    有没有朋友做过动态表结构的,请教一下
    使用PPC的朋友慎用 星空极速3.2.070416_GD
    自定义app_offline.htm,让网站升级提示更专业
    2010全面兼容IE6/IE7/IE8/FF的CSS HACK写法
    CSS Sprites
    自适应宽度圆角按钮,导航,用到了滑动门技术
    设置frameset的高度
    jquey checkbox全选,反选
  • 原文地址:https://www.cnblogs.com/lingcai/p/9549720.html
Copyright © 2011-2022 走看看