zoukankan      html  css  js  c++  java
  • 面向对象类成员

    面向对象类成员:字段,方法,属性

    一、字段:

    举个例子:

    class Foo:
        def __init__(self, name):
            self.name = name

    其中的self.name就是字段,不过这是一个普通的字段,保存在对象中,可以通过对象去访问例如:

    1 obj = Foo("DJC")
    2 print(self.name)
    3 
    4 >>>DJC

    除了普通字段还有静态字段来看以下代码:

    class Foo:
    
        s = 123
    
        def __init__(self, name):
            self.name = name
    
        def show(self):
            print(self.name)

    这里面的s = 123 就是静态字段,保存在类里,可以通过类来访问例如:

    print(Foo.s)
    >>>123

    tips:一般情况下:自己访问自己的字段

      规则:1、普通字段对象访问

         2、静态字段类访问

         3、通过对象可以访问类的字段,反过来不可以

    二、方法

    举个例子:

    def show(self):
        print(self.name)

    这个为普通方法,由对象去调用执行,方法属于类

    当然也有静态方法,例如:

    @staticmethod
    def f1(a1, a2):
        print(a1, a2)

    静态方法由类调用执行,你会发现静态方法没有self参数,而且有staticmethod装饰器装饰,这是与普通方法的不同之处

    Foo.f1(11, 22)
    
    >>>11,22

    还有一种就是类方法,也是由类执行

    @classmethod
    def f2(cls):
        print(cls)

    类方法至少要有一个参数cls,是class的缩写,且有一个classmethod装饰器装饰

    Foo.f2()
    
    >>><class '__main__.Foo'>

    三、属性

    举个例子:

    Class Foo:
        
        def __init__(self, all_count):
            self.all_count = all_count
        # 具有方法的表示形式,字段的访问形式
    @property # 用了property装饰器,当调用all_pager时就不用加小括号了,就像在取字段一样 def pager(self): a1, a2 = divmod(self.all_count, 10) if a2 == 0: return a1 else: return a1+1 # 字段可以通过赋值改变字段的值,那么用了property的方法能不能呢?可以的,例如 @pager.setter def pager(self, value): print(value) @pager.deleter def pager(self): print("del")

    我们看看他的调用:

    obj = Foo(107)
    ret = obj.pager     # 不加小括号就能直接调用pager方法
    print(ret)
    
    >>>11
    
    
    obj.pager = 'DJC'
    
    >>>DJC        # 执行的是print(value)
    
    del obj.pager
    
    >>>del         # 执行的是print('del')

    似乎有点不知所以然,我们可以来看看图形解说:

    意思就是用另外一种形式去调用类里的方法,以上的方法还有另发一种形式:

     1 class Foo:
     2 
     3     def __init__(self, all_count):
     4         self.all_count = all_count
     5 
     6     def pager1(self):
     7         a1, a2 = divmod(self.all_count, 10)
     8         if a2 == 0:
     9             return a1
    10         else:
    11             return a1 + 1
    12 
    13     def pager2(self, value):
    14         print(value)
    15 
    16     def pager3(self):
    17         print("del")
    18 
    19     foo = property(fget=pager1, fset=pager2, fdel=pager3)
    20 
    21 obj = Foo(107)
    22 ret = obj.foo
    23 print(ret)
    24 obj.foo = 'DJC'
    25 del obj.foo

    我们看看图形解说:

    都是一一对应的关系,你用那种方式写就调用那个方法,属性的本质就是方法!

  • 相关阅读:
    SkyWalking链路追踪系统-告警篇
    在k8s中解决pod资源的正确识别
    SkyWalking链路追踪系统-接入篇
    Jenkins API+Pipeline深度实践之input的自动化
    SkyWalking链路追踪系统-部署篇
    DevOps建设之基于钉钉OA审批流的自动化上线
    使用kube-prometheus部署k8s监控(最新版)
    基于k8s手动部署rabbitmq集群
    ant desgin vue中table复选框根据状态disabled置灰
    ant design vue 中tree实现单选
  • 原文地址:https://www.cnblogs.com/learnC/p/6089794.html
Copyright © 2011-2022 走看看