• 17_python_成员


    一、类成员

      1、字段

     1 class Province:
     2     country = '中国'     # 实例 (静态) 字段;类变量. 不属于对象, 对象可以访问
     3 
     4     def __init__(self, name):  
     5         self.name = name   # 普通字段
     6 
     7 obj = Province('河北省')   # 直接访问普通字段
     8 print obj.name
     9 
    10 Province.country    # 直接访问静态字段
    11 obj.country = "澳大利亚" # 注意。 这里和类变量没由一毛钱关系, 给alex单独加一个属性叫country = ”澳大利亚“
    12 print(obj.country) # 澳大利亚 # 拿到的是自己的。成员实例变量 字段
    13 # 总结:类变量,用类名去操作. 规范.
     由上图可是:静态字段在内存中只保存一份;普通字段在每个对象中都要保存一份
     
        2、方法 -- 普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同
        
            普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
            类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
            静态方法:由类调用;无默认参数;
     1 class Person:
     2 
     3     def __init__(self):
     4         pass
     5     # 实例方法需要传递类的对象 self
     6     def think(self):
     7         print("人能思考")
     8 
     9     # 静态方法不需要传递对象或者类
    10     @staticmethod # 静态方法
    11     def jisuan(a, b):
    12         print("我来过这里")
    13         return a + b
    14 
    15     # 类方法: 第一个参数传递的是类名
    16     @classmethod
    17     def clsMethod(cls): # cls表示的类
    18         p = cls() # 可以动态的创建对象.
    19         print("我是一个类方法", p)
    20 
    21 
    22 # p = Person()
    23 # p.think()
    24 #
    25 # Person.think(p)
    26 
    27 # 静态方法的调用:
    28 
    29 # c = Person.jisuan(1, 2) #  类名可以访问
    30 # print(c)
    31 #
    32 # p = Person()
    33 # d = p.jisuan(3, 5) # 用对象也可以访问
    34 # print(d)
    35 
    36 # 记住, 静态的内容用类名访问
    37 
    38 Person.clsMethod() # 类方法默认第一个参数接收的是类名
    39 
    40 相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
    41 不同点:方法调用者不同、调用方法时自动传入的参数不同。
    3、属性
     
        (1) 属性的基本使用
     1 # ############### 定义 ###############
     2 class Foo:
     3 
     4     def func(self):
     5         pass
     6 
     7     # 定义属性
     8     @property
     9     def prop(self):
    10         pass
    11 # ############### 调用 ###############
    12 foo_obj = Foo()
    13 
    14 foo_obj.func()
    15 foo_obj.prop   #调用属性
    16 
    17 属性的定义和使用
    由属性的定义和调用要注意一下几点:
    • 定义时,在普通方法的基础上添加 @property 装饰器;
    • 定义时,属性仅有一个self参数
    • 调用时,无需括号
                 方法:foo_obj.func()
                 属性:foo_obj.prop
    注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象
            属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能。
    实例:对于主机列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据(即:limit m,n),这个分页的功能包括:
    • 根据用户请求的当前页和总数据条数计算出 m 和 n
    • 根据m 和 n 去数据库中请求数据 
     1 # ############### 定义 ###############
     2 class Pager:
     3     
     4     def __init__(self, current_page):
     5         # 用户当前请求的页码(第一页、第二页...)
     6         self.current_page = current_page
     7         # 每页默认显示10条数据
     8         self.per_items = 10
     9 
    10 
    11     @property
    12     def start(self):
    13         val = (self.current_page - 1) * self.per_items
    14         return val
    15 
    16     @property
    17     def end(self):
    18         val = self.current_page * self.per_items
    19         return val
    20 
    21 # ############### 调用 ###############
    22 
    23 p = Pager(1)
    24 p.start 就是起始值,即:m
    25 p.end   就是结束值,即:n
    二、类成员的修饰符
     
        公有成员,在任何地方都能访问
        私有成员,只有在类的内部才能方法
     
        1、私有成员
    1 class Person:    
    2     def __init__(self, laopo, mimi):
    3             self.__laopo = laopo    # 私有的   
    4             self.__mimi = mimi
    5 
    6 alex = Person("wusir", "他俩搞基")
    7 print(alex.__mimi) # 私有的. 谁都不不能碰,会报错
        可以 通过这个公共的方法来获取到私有的内容. 这样做的好处是. 外界, 只能看, 但是改不了. 不单单实例变量有私有的. 类变量(静态变量量)一样拥有这样的属性:
     1 class Person:    
     2     __zisi = "人都是自私的"      # 人都是自私的. 但是这个自私又不希望别人知道    
     3     def __init__(self, laopo, mimi):
     4         self.__laopo = laopo    # 私有的
     5         self.__mimi = mimi
     6     def gaosuni(self):
     7             print("大喇喇叭开始广播了了")
     8             return self.__mimi
     9 alex = Person("wusir", "他俩搞基")
    10 mimi = alex.gaosuni()
    11 print(mimi)
    12 print(Person.__zisi)    # 报错
     1 class Person:
     2     __zisi = '人都是自私的'
     3     def __init__(self, laopo, mimi):
     4         self.__laopo = laopo
     5         self.__mimi = mimi
     6     def gaosuni(self):
     7         print('大喇叭开始广播了')
     8         return self.__mimi
     9 
    10 alex = Person('wusir', '他俩搞基')
    11 mimi = alex.gaosuni()
    12 print(mimi)
    13 print(Person.__zisi) #报错
     
        2、私有方法
     1 class Person:
     2     def __init__(self):
     3         pass
     4     def __yue(self):     # __yue是⼀一个私有的⽅方法. 只能在类中⾃自⼰己调⽤用. 类外⾯面不能访问.
     5         print('我要约会')
     6     def job(self):
     7         print('我要工作')
     8 
     9 p = Person()
    10 # p.__yue() 报错
    11 p.job()
    子类无法继承私有方法
  • 相关阅读:
    Count on a tree
    图论1 1009
    DP2 1008
    DP1 1008
    NOIP 模拟 1006
    2019 CSP-S 初赛退役记
    9.13——TEST NOIP模拟测试
    [洛谷P2387][NOI2014]魔法森林
    [洛谷P2596][ZJOI2006]书架
    [BZOJ4241]历史研究
  • 原文地址:https://www.cnblogs.com/hq82/p/9709432.html
Copyright © 2020-2023  润新知