zoukankan      html  css  js  c++  java
  • 实例方法、类方法和静态方法

    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 "不能使用类对象调用"
    

  • 相关阅读:
    三个心态做人做学问 沧海
    成功走职场要找准自己的"快捷键" 沧海
    免费离线下载 拂晓风起
    Hibernate 获取某个表全部记录时 奇怪现象 (重复出现某个记录) 拂晓风起
    无法读取mdb 如果连接不了ACCESS mdb文件,就尝试安装MDAC 拂晓风起
    Netbeans 使用 Hibernate 逆向工程 生成hbm和pojo 拂晓风起
    如何点击单选框 radio 后面的文字,选中单选框 拂晓风起
    Java 连接access 使用access文件 不用配置 拂晓风起
    mysql下如何执行sql脚本 拂晓风起
    Hibernate配置access Hibernate 连接 access 拂晓风起
  • 原文地址:https://www.cnblogs.com/cpy-devops/p/9287340.html
Copyright © 2011-2022 走看看