美文网首页
python的调用类变量和实例变量、类方法和静态方法以及实例方法

python的调用类变量和实例变量、类方法和静态方法以及实例方法

作者: alexlee666 | 来源:发表于2019-07-09 14:18 被阅读0次

    一、Python中的变量和方法分类

    • 类变量:定义在class中且method外,为类和所有实例共享,包括public和private类型,调用方法: 类名.变量名 或者 实例名.变量名;
    • 实例变量:调用__init__(参数)方法去实例化对象时创建的变量,为当前实例所独享,调用方法: 实例名.变量名;
    • 局部变量:定义在方法内部的变量,为方法所独享;
    • 类方法:使用@classmethod注解,为类和所有实例共享,调用方法: 类名.方法名 或者 实例名.方法名;
    • 静态方法:使用@staticmethod注解,与当前类和实例不存在所属关系,调用方法: 类名.方法名 或者 实例名.方法名;
    • 实例方法-public:为当前实例独享,调用方法: 实例名.方法名;
    • 实例方法-private:为当前实例独享,必须在其他的实例方法中调用,调用方法: 实例名.方法名。

    二、Python中变量和方法的引用

    2.1 测试源码
    
    # 类名,其中参数object为被继承的父类,默认为object(python中object是其他所有类的父类)
    class CharUtil(object):
        # 类变量--被所有实例共享
        int_1 = '1'
        ch_2 = '2'
        # private类型
        __float_3 = 1.23456
    
        # 构造方法
        def __init__(self, ch, a, b):
            # 实例变量--仅为当前实例所有
            self.ch = ch
            self.a = a
            self.b = b
            pass
    
        # 类方法,参数cls表示当前class,调用方法:类名.方法名,或者实例名.方法名
        @classmethod
        def test1(cls):
            print("调用类方法,打印类变量:{}, {}, {}".format(cls.int_1, CharUtil.ch_2, cls.__float_1))
    
        # 静态方法,可以无参数,调用方法:类名.方法名,或者实例名.方法名
        @staticmethod
        def char2Upper(c):
            newChar = c
            if 'a' <= c <= 'z':
                newChar = chr(ord(newChar) - 32)
            return newChar
    
        # 实例方法-private,必须在其他的实例方法中调用,调用方法:实例名.方法名,self即当前实例
        def __char2Lower(self, c):
            newChar = c
            if 'A' <= c <= 'Z':
                newChar = chr(ord(newChar) + 32)
            return newChar
    
        # 实例方法-public,调用方法:实例名.方法名
        def str2Lower(self, string):
            newStr = ''
            for ch in string:
                if 'A' <= ch <= 'Z':
                    # 调用实例方法-private
                    newStr += self.__char2Lower(ch)
                else:
                    newStr += ch
            return newStr
    
    
    # 普通方法(非类),调用方法:方法名(参数)
    def char2Upper(c):
        newChar = c
        if 'a' <= c <= 'z':
            newChar = chr(ord(newChar) - 32)
        return newChar
    
    
    # 调用普通方法,格式化输出
    print(">>>>>> %.3f" % 1.123456)
    print("调用普通方法: %s" % char2Upper('a'))
    # 调用静态方法
    print("调用静态方法: %s" % CharUtil.char2Upper('b'))
    # 调用类方法
    CharUtil.test1()
    # 调用实例方法-public
    charUtil = CharUtil('para1', 'para2', 'para3')
    print("调用实例方法-public, new String is: {}".format(charUtil.str2Lower("EfG")))
    print("实例变量: {}, {}, {}".format(charUtil.ch, charUtil.a, charUtil.b))
    
    # 以上代码写在同一个python模块(即同一个.py文件),
    # 一个python模块可以定义多个类和变量以及方法,
    # 如果需要在其他python模块中引用该模块的类或变量或方法,
    # 需要使用import将该模块或被引用的元素import进来。
    
    
    2.2 测试结果
    
    >>>>>> 1.123
    调用普通方法: A
    调用静态方法: B
    调用类方法,打印类变量:1, 2
    调用实例方法-public, new String is: efg
    实例变量: para1, para2, para3
    
    

    三、总结

    3.1方法定义
    • 类方法必须要添加至少1个参数,第1个参数必须是当前类对象,一般写为cls(表示class本身);
    • 静态方法可以不添任何参数;
    • 实例方法必须添加至少1个参数,且第1个参数必须是self,表示当前实例;
    • 构造方法__init__必须要添加至少1个参数,且第1个参数必须是self)self后的参数为实例变量;
    • private类型的实例方法名和private类型的类变量名都以__开头,构造方法以__开头和结尾。
    3.2 方法调用
    • 实例化对象时传入的参数不包括self;
    • 实例化对象时传入的参数个数必须与初始化方法__init__的self后的参数个数一致。
    3.3 为什么需要类方法和静态方法

    假设有1个Student类和1个Friend类,其中Friend类继承了Student类,现在需要实现以下功能:

    • 每次实例化1个Fridend,Student人数都+1;
    • 实例化若干个Friend,统计Student人数。

    思考:这个问题用类方法或者静态方法做比较合适,为什么?因为实例化的是Friend,但是如果我从Friend实例中获得Student总人数,在逻辑上显然是不合理的。同时,如果想要获得Student总人数,去生成一个Student的实例也是没有必要的。

    class Student(object):
    
      # private 类变量,学生人数
        __stuNum = 0
    
        def __init__(self):
            Student.addNum()
    
        # 类方法
        @classmethod
        def getStuNum(cls):
            return cls.__stuNum
    
        @classmethod
        def addNum(cls):
            cls.__stuNum += 1
    
    
    class Fridend(Student):
        def __init__(self):
            super().__init__()
    
    
    a = Fridend()
    b = Fridend()
    print(Student.getStuNum())
    
    

    相关文章

      网友评论

          本文标题:python的调用类变量和实例变量、类方法和静态方法以及实例方法

          本文链接:https://www.haomeiwen.com/subject/gulxkctx.html