zoukankan      html  css  js  c++  java
  • day⑦:类的3大成员

    start

    py3


    类的三大成员: 字段(变量)  、属性、方法


    一.字段(实例变量和类变量)

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/usr/bin/env python
    #coding=utf-8
     
    class Province:
        '''
        字段(变量)包括:普通字段(实例变量)和静态字段(类变量),他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,
     
        普通字段(实例变量)属于对象
        静态字段(类变量)属于类
        '''
     
        #静态字段(类变量)
        country="中国"
     
        def __init__(self,name):
     
            #普通字段(实例变量)
            self.name=name
     
     
     
    #直接访问普通字段(实例变量)
    obj=Province("广州")
    print(obj.name)
     
    obj.name="你妹"
    obj.name2="你妹2"
    obj.yaobin="自己定义实例变量"
     
    print(obj.name)
    print(obj.name2)
    print(obj.yaobin)
     
     
     
    #直接访问静态字段(类变量)
    print(Province.country)
     
     
     
    ##结果:
    广州
    你妹
    你妹2
    自己定义实例变量
    中国



    二.属性

    ①装饰器方式定义属性之新式类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/usr/bin/env python
    #coding=utf-8
      
    '''
    装饰器方式:在类的普通方法上应用@property装饰器
    '''
      
    #新式类
    class animal(object):
        '''
        新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法
        '''
      
        def __init__(self, name):
            self.name = name
            self.num = None
      
      
      
        @property
        def price(self):
            return self.num
      
      
        @price.setter
        def price(self,num):
            self.num=num
            print("设置num",self.num)
      
      
        @price.deleter
        def price(self):
            print("删除",self.num)
            del self.num
      
      
      
    dog=animal("随便"#实例化
      
    ################################################################################
      
    print(dog.price)  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
                      #输出是None
      
    dog.price="123456"  # 自动执行 @price.setter 修饰的 price 方法,并将  123456 赋值给方法的参数
    print(dog.price)     #现在是123456了
      
      
    del dog.price     # 自动执行 @price.deleter 修饰的 price 方法
    #print(dog.price)  #再打印,是会报错的
      
      
    ##结果:
    None
    设置num 123456
    123456
    删除 123456




    ②装饰器方式定义属性之经典类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/usr/bin/env python
    #coding=utf-8
     
    '''
    装饰器方式:在类的普通方法上应用@property装饰器
    '''
     
    #经典类
    class Goods:
        '''
        经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法
        '''
        @property
        def price(self):
            return "yaobin"
     
     
     
    obj=Goods()
    result=obj.price #自动执行 @property 修饰的 price 方法,并获取方法的返回值
     
    print(result)
     
     
    #结果:
    yaobin



    ③静态字段(类变量)方式定义属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #!/usr/bin/env python
    #coding=utf-8
     
     
    '''
    创建值为property对象的静态字段(类变量)
    '''
     
    class Foo(object):
        '''
        当使用静态字段(类变量)的方式创建属性时,经典类和新式类无区别
        '''
        def __init__(self,name):
            self.name = name
            self.num = None
     
        def get_bar(self):
            return self.num
     
     
        #必须两个参数
        def set_bar(self,num):
            self.num=num
            print("设置num",self.num)
     
        def del_bar(self):
            print("我要删了num",self.num)
            del self.num
     
        BAR=property(get_bar,set_bar,del_bar,'描述信息')
     
     
     
    obj=Foo("haha"#实例化
     
    #############调用##################
     # 自动调用第一个参数中定义的方法:get_bar
    print(obj.BAR)
     
     
    # 自动调用第二个参数中定义的方法:set_bar方法,并将123456当作参数传入
    obj.BAR=123456
    print(obj.BAR)
     
    # 自动调用第三个参数中定义的方法:del_bar方法
    del obj.BAR
    #print(obj.BAR)  #再打印,报错!
     
     
    ##结果:
    None
    设置num 123456
    123456
    我要删了num 123456



    三.方法

    1.普通方法、2.类方法、3.静态方法

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #!/usr/bin/env python
    #coding=utf-8
      
    class Foo:
        '''
        方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
      
        普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
        类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
        静态方法:由类调用;无默认参数;
        '''
        test="gril" #类变量
      
        def __init__(self,name):
            self.name=name
      
        def ord_func(self):
            """ 定义普通方法,至少有一个self参数 """
            print("普通方法%s"%(self.name))
      
      
        @classmethod
        def class_func(cls):
            """ 定义类方法,至少有一个cls参数 """
            #print("类方法 %s",self.name)  #不能访问普通字段(实例变量)
            print("类方法",Foo.test) #可以访问静态字段(类变量)
      
        @staticmethod
        def static_func():
            """ 定义静态方法 ,无默认参数"""
            print("静态方法")   #不能访问类变量(静态字段),也不能访问实例变量(普通字段),和类就一个组织逻辑关系,没什么用
      
      
    #实例化
    obj=Foo("yaobin")
      
      
      
    #调用普通方法
    obj.ord_func()
      
      
    #调用类方法
    Foo.class_func()
      
      
    #调用静态方法
    Foo.static_func()
      
      
    ##结果:
    普通方法yaobin
    类方法 gril
    静态方法







    end





  • 相关阅读:
    面向对象与面向过程的区别
    IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题
    ldap bdb_db_open 错误解决办法
    转载:技术普及帖:你刚才在淘宝上买了一件东西
    js错误捕捉
    Linux服务器管理系统wdcp Lanmp
    [译]Pro ASP.NET MVC 3 Framework 3rd Edition (Chapter 20 JQuery) 0.引言
    发一个自己写的账号管理软件
    [译]Pro ASP.NET MVC 3 Framework 3rd Edition (Chapter 20 JQuery) 4.Basic jQuery Theory jQuery理论基础
    资源下载(2011609更新)
  • 原文地址:https://www.cnblogs.com/binhy0428/p/5272268.html
Copyright © 2011-2022 走看看