实例方法、类方法和静态方法

耗尽温柔 提交于 2020-04-08 13:58:07

Python中常用的三种方法:

        1. 实例方法 (常见函数)

        2. 静态方法 (@staticmethod)

        3. 类方法  (@classmethod)

实例方法

    定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);

    调用:只能由实例对象调用。

类方法

    定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它性来传递类的属和方法(不能传实例的属性和方法);

    调用:实例对象和类对象都可以调用。

静态方法

    定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用实例的任何属性和方法,使用类的属性和方法需要使用类对象引用;

    调用:实例对象和类对象都可以调用。

 

一、区别

  

二、代码示例

  

#!/usr/bin/env python  
# -*- coding:utf-8 _*-
__author__ = '池偏一'
 
'''
    @author:shz
    @license: Apache Licence
    @file: testargs.py
    @time: 2018/06/19
    @site:
    @software: PyCharm
'''
 
import sys
 
reload(sys)
sys.setdefaultencoding('utf-8')
 
 
class Test(object):
    # 测试类属性
    name = 'jwh'
 
    # 测试实例属性
    def __init__(self):
        self.age = 30
        self.address = '上海'
 
    # 测试私有实例方法
    def __instances(self):
        print "this is test instance"
 
    # 测试实例方法
    def instances_pub(self):
        school = '复旦大学'
        print school
 
    @classmethod
    def testclass(cls):
        job = 'dev'
        print job
 
    # -*-------------------------*- #
 
    # 该实例方法调用其他测试内容,看是否能成功
    def func(self):
        print Test.name  # 传递类属性
        print self.name  # 传递实例属性
        print self.age  # 传递实例属性
        self.__instances()  # 传递实例方法
        self.instances_pub()  # 传递实例方法
        self.testclass()  # 传递类方法
 
    @classmethod
    def class_func(cls):
        print cls.name  # 传递类属性
        cls.testclass()  # 传递类方法
        Test.testclass()  # 传递类方法
 
        try:
            print cls.address
        except AttributeError:
            print '类方法不能传递实例属性'
 
        try:
            cls.__instances()  # 传递实例方法
        except TypeError:
            print '类方法不能传递实例方法'
 
        try:
            cls.instances_pub()  # 传递实例方法
        except TypeError:
            print '类方法不能传递实例方法'
 
    @staticmethod
    def static_func():
        try:
            print Test.name  # 传递类属性
        except AttributeError:
            print '静态方法不能传递类属性'
 
        try:
            Test.testclass()  # 传递类方法
        except:
            print '静态方法不能传递类方法'
 
        try:
            print Test.address  # 传递实例属性
        except AttributeError:
            print '静态方法不能传递实例属性'
        try:
            Test.__instances()  # 传递实例方法
        except TypeError:
            print '静态方法不能传递实例方法'
        try:
            Test.instances_pub()  # 传递实例方法
        except TypeError:
            print '静态方法不能传递实例方法'
 
    # -*-------------------------*- #

  2.1  测试实例方法的传递和实例对象调用  

try:
    t = Test()
    t.func()
except TypeError, e:
    print "不能使用实例对象调用"

  2.2 测试实例方法的传递和类对象的调用

try:
    Test.func()
except TypeError, e:
    print "不能使用类对象调用"  

  2.3 测试类方法的传递和实例对象调用

try:
    t = Test()
        t.class_func()
except TypeError, e:
        print '不能使用实例对象调用'  

  2.4 测试类方法的传递和类对象调用

try:
    Test.class_func()
except TypeError, e:
    print '不能使用类对象调用'

  2.5 测试静态方法的传递和实例对象调用

try:
    t = Test()
    t.static_func()
except TypeError:
    print "不能使用实例对象调用"

  2.6 测试静态方法的传递和类对象调用

try:
    Test.static_func()
except TypeError:
    print "不能使用类对象调用"

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!