zoukankan      html  css  js  c++  java
  • (python)面向对象进阶

    类的成员

      类的成员可以分成三大类:字段丶方法和属性

      

    注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。

    一丶字段

    字段包括:普通字段和静态字段,他们在定义和使用中有区别,而最本质的区别是内存中保存的位置不同

    ·普通字段属于对象

    ·静态字段属于类

    class Province:
    
        # 静态字段
        country = '中国'
    
        def __init__(self, name):
    
            # 普通字段
            self.name = name
    
    
    # 直接访问普通字段
    obj = Province('河北省')
    print obj.name
    
    # 直接访问静态字段
    Province.country
    字段的定义和使用

    由上图可知:

        静态字段在内存中只保存一份

        普通字段在每个对象中都要保存一份

    应用场景:

        通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段

    二丶方法

      方法包括,普通方法,静态方法和类方法,三种方法在内存中都归属于类,区别在于调用的方式不同

        ·普通方法:由对象调用,至少一个self参数,执行普通方法时,将自动调用该方法的对象赋值给self 

        ·类方法:由类调用,至少一个cls参数,执行类方法时,自动调用该方法的类赋值给cls

        ·静态方法:由类调用,无默认参数

     1 class Foo:
     2 
     3     def __init__(self, name):
     4         self.name = name
     5 
     6     def ord_func(self):
     7         """ 定义普通方法,至少有一个self参数 """
     8 
     9         # print self.name
    10         print '普通方法'
    11 
    12     @classmethod
    13     def class_func(cls):
    14         """ 定义类方法,至少有一个cls参数 """
    15 
    16         print '类方法'
    17 
    18     @staticmethod
    19     def static_func():
    20         """ 定义静态方法 ,无默认参数"""
    21 
    22         print '静态方法'
    23 
    24 
    25 # 调用普通方法
    26 f = Foo()
    27 f.ord_func()
    28 
    29 # 调用类方法
    30 Foo.class_func()
    31 
    32 # 调用静态方法
    33 Foo.static_func()
    方法的定义和使用

    相同点:对于所有方法而言,均属于类(非对象)中,所以,在内存中也只保存一份

    不同点:方法调用者不同,调用方法时自动传入的参数不同

    三丶属性

      1.属性的基本使用

    # ############### 定义 ###############
    class Foo:
    
        def func(self):
            pass
    
        # 定义属性
        @property
        def prop(self):
            pass
    # ############### 调用 ###############
    foo_obj = Foo()
    
    foo_obj.func()
    foo_obj.prop   #调用属性
    属性的定义和使用

     

    由属性的定义和调用要注意以下几点:

      定义时:在普通方法的基础上添加@proprety

      定义时:属性仅有一个self参数

      调用时:无需括号

          方法:foo_obj.func()

          属性:foo_obj_prop

    注意:属性存在的意义是,访问属性时可以制造出和访问字段完全相同的假象

      属性由方法变种而来,如果python中没有属性,完全可以代替其功能

    实例:对于主机列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据(即:limit m,n),这个分页的功能包括:

    • 根据用户请求的当前页和总数据条数计算出 m 和 n
    • 根据m 和 n 去数据库中请求数据 
    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)
    实例

    python的属性功能是:属性内部进行一系列的逻辑运算,最终将计算结果返回

     四丶嵌套

     1 # by luffycity.com
     2 """
     3 创建三个学校且三个学校的设施内容等都是一致.
     4 """
     5 
     6 class School(object):
     7     def __init__(self, name, address):
     8         self.name = name
     9         self.address = address
    10 
    11     def speech(self):
    12         print('讲课')
    13 
    14 obj1 = School('北京校区', '美丽富饶的沙河')
    15 obj2 = School('上海校区', '浦东新区')
    16 obj3 = School('深圳校区', '南山区')
    17 class Teacher(object):
    18     def __init__(self, name, age, salary):
    19         self.name = name
    20         self.age = age
    21         self.__salary = salary
    22         self.school = None
    23 
    24 t1 = Teacher('李杰', 19, 188888)
    25 t2 = Teacher('艳涛', 18, 60)
    26 t3 = Teacher('女神',16, 900000)
    27 # ############## 老师分配校区
    28 t1.school = obj1
    29 t2.school = obj1
    30 t3.school = obj2
    31 # ####################################
    32 # 查看t1老师,所在的校区名称/地址
    33 print(t1.school.name)
    34 print(t1.school.address)
    35 print(t1.name)
    36 print(t1.age)
    37 t1.school.speech()
    嵌套实例

        ·

  • 相关阅读:
    TensorFlowMNIST数据集逻辑回归处理
    TensorFlow多元线性回归实现
    TensorFlow简单线性回归
    mysql ON DUPLICATE KEY UPDATE
    20200908 morning diary
    LambdaUtil
    数据库SQL自我书写册
    getMyFriendsListFromWeChat()
    MySQL8.*的JSON语法知多少
    Exception in thread "main" java.lang.IllegalArgumentException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token at [Source: UNKNOWN; line: -1, c
  • 原文地址:https://www.cnblogs.com/xintiao-/p/9549241.html
Copyright © 2011-2022 走看看