zoukankan      html  css  js  c++  java
  • Python——方法

    方法是类或者对象行为特征的抽象,方法其实也是函数,它的定义方式、调用方式与函数都很相似。

    一、类调用实例方法

    先来看一段代码:

    # 定义全局空间test函数
    def test():
    	print ('全局空间test方法')
    # 定义全局空间num变量
    num = 1
    
    # 定义Test01类
    class Test01:
            # 定义Test01空间内的test02函数
    	def test02():
    		print ('Test01空间的test02方法')
            # 定义Test01空间内的num变量
    	num = 2
    
    #调用全局函数test()
    test()    # 打印 全局空间test方法
    
    # 调用 Test01空间的函数test02()
    Test01.test02()    # Test01空间的test02方法
    
    #调用全局变量num
    print (num)    # 打印 1
    
    # 调用Test01空间的变量num
    print (Test01.num)       # 打印 2
    

    上面代码中,可以看出全局空间内定义的函数和在Test01类中定义的函数没有多大区别,在调用Test01类中的函数和变量,只需要类名.变量名或者类名.函数名就可以了,这就是类调用实例。

    值得注意的是,使用类名.函数名访问的是函数,使用实例.函数名访问的是方法。

    例:

    A = Test01()
    from types import FunctionType,MethodType
    # 通过实例访问的是方法
    print (isinstance(A.test02,MethodType))    # 打印 True
    # 通过类访问的是函数
    print (isinstance(Test01.test02,FunctionType))    # 打印 True
    

    如果使用类调用实例方法,第一个参数不会自动绑定,只能手动去为第一个参数绑定参数值。

    例:

    class Tree:
    	def apple_tree(self):
    		print ('这是一棵树',self)
    
    # 直接使用类名.函数名调用,由于第一个参数不会自动绑定,会报错 TypeError: apple_tree() missing 1 required positional argument: 'self'
    Tree.apple_tree()
    
    
    T = Tree()
    # 为第一个参数绑定参数值
    Tree.apple_tree(T)    # 打印 这是一棵树 <__main__.Tree object at 0x0000000002E335F8>
    
    
    # 第一个参数绑定的参数值不一定要绑定该Tree类的对象T,例如绑定字符串
    Tree.apple_tree('雪梨树')    # 打印 这是一棵树 雪梨树
    

    二、类方法和静态方法

    使用@classmethod装饰的方法是类方法,python会自动绑定类方法的第一个参数到类本身(参数名通常是cls),可以通过他来传递类的属性和方法,但不能传递实例的属性和方法;使用@staticmethod装饰的方法是静态方法,静态方法不会自动绑定第一个参数到类本身,且静态方法没有‘self’和‘cls’参数,方法中不能使用类或实体的任何属性和方法。

    类方法,例:

    class a:
    	a1 = 0
    	def c():
    		print ('a类的c方法')
    	@classmethod
    	def b(cls):
    		cls.c()
    		print (cls.a1)
    # 通过类调用,自动绑定类方法的第一个参数,不需要手动去绑定
    a.b()  
    '''  
    打印
    a类的c方法
    0
    '''
    
    # 通过实例对象调用
    A = a()
    A.b()
    '''
    打印
    a类的c方法
    0
    '''    
    

    静态方法,例:

    class a:
    	@staticmethod
    	def b():
    		print ('b()是静态方法')
    
    # 通过类调用
    a.b()    # 打印 b()是静态方法
    
    # 通过实例对象调用
    A = a()
    A.b()    # 打印 b()是静态方法
  • 相关阅读:
    转_前端开发技术概要
    获取链接的参数
    tabIndex 主要是美化tab键切换的体现
    textarea自动增高并隐藏滚动条
    Zen Coding:css,html缩写替换大观让你的html,css飞起来
    动态添加链接颜色代码
    转javascript 数组
    为指定元素增加样式
    1 CodeBox代码盒子 alpha版发布
    转发布js支持Firefox的加入收藏代码
  • 原文地址:https://www.cnblogs.com/mingmingming/p/11116818.html
Copyright © 2011-2022 走看看