zoukankan      html  css  js  c++  java
  • Python面向对象中的classmethod类方法和__getattr__方法介绍

    一、classmethod介绍

    介绍:@classmethod修饰符我们从名称就可以知道,这是一个类方法,那么和普通的类中的方法有什么不同的

    a、类方法,是由类本身调用的,无需实例化类,直接用类本身调用即可,但是要注意实例对象也可以调用类方法

    b、类方法,无需要要一个self参数,这个self参数表示类的实例对象,但是他需要一个cls参数,这个参数表示类本身

    c、类方法,可以调用类的属性,类的方法,类的实例对象

    下面我们正常进入介绍classmethod这个修饰符

    1、类方法可以由类调用,也可以由实例对象调用

    class Test(object):
        n = 1
    
        def func1(self):
            return self.n
    
        @classmethod
        def func2(cls):
            return cls.n
    
    
    
    a = Test()
    
    # 类调用类方法
    b = Test.func2()
    
    # 实例对象调用类方法
    c = a.func2()
    
    print(b,c)
    

    可以正常运行,说明类方法可以被类调用,也可以被实例对象调用

    2、未被classmethod修饰的方法可以被类调用,但是要传递一个实例对象给实例方法

    先看一个错误的例子,由类去调用普通的类的方法,不传递一个实例对象,会报错

    class Test(object):
        n = 1
    
        def func1(self):
            return self.n
    
        @classmethod
        def func2(cls):
            return cls.n
    
    
    
    # a = Test()
    
    t = Test.func1()
    

    错误如下

    TypeError: func1() missing 1 required positional argument: 'self'
    

    下面在看下正确的例子

    由类去调用普通的类的方法,但是传递一个实例对象给类的普通的方法

    class Test(object):
        n = 1
    
        def func1(self):
            return self.n
    
        @classmethod
        def func2(cls):
            return cls.n
    
    
    
    a = Test()
    
    t = Test.func1(a)
    

    可以正常输出结果

    3、类的方法可以调用类的属性

    在类的方法中调用类的属性是可以的

    class Test(object):
        n = 1
    
        def func1(self):
            return self.n
    
        @classmethod
        def func2(cls):
            # 在类方法中,可以调用类的属性
            return cls.n
    

    4、在类的方法中调用类的方法

    类方法中调用类方法是可以的

    class Test(object):
        n = 1
    
        def func1(self):
            return self.n
    
        @classmethod
        def func2(cls):
            # 在类方法中,可以调用类的属性
            cls.func3()
            return cls.n
    
        @classmethod
        def func3(cls):
            print("我是一个被调用的类方法")
    

    5、实例方法中调用类方法

    在实例方法中调用类的方法也是可以的

    class Test(object):
        n = 1
    
        def func1(self):
            # 在实例方法中调用类的方法
            Test.func3()
            return self.n
    
        @classmethod
        def func2(cls):
            # 在类方法中,可以调用类的属性
            cls.func3()
            return cls.n
    
        @classmethod
        def func3(cls):
            print("我是一个被调用的类方法")
    
    
    
    
    
    a = Test()
    a.func1()
    

    二、__getattr__介绍

    这个方法是类中的一个方法,如果我们实例化这个类,通过类的实例对象打印一个一个不存在的属性,则会执行__getattr__这个方法

    class test_attr(object):
        def __init__(self,name):
            self.name = name
    
        def test(self):
            return self.name
    
        def __getattr__(self, item):
            s = str(item) + "+" + str(self.name)
            return s
    

    然后我们来实例化类,然后执行

    a = test_attr("dsb")
    
    print(a.sdb)
    
    print(a.name)
    

    结果如下

    sdb+dsb
    dsb
    

    分析

    我们看到类本身没有sdb这个属性,但是有name这个属性

    通过实例对象调用sdb,如果没有__getattr__这个方法就会报错,如果有这个方法,就会把sdb这个当做一个字符串传递给__getattr__这个方法,并赋值给item,然后执行__getattr__z这个方法

    通过实例对象调用name这个属性,因为实例对象有name这个属性,所以就不会走__getattr__这个方法

    大家明白了这个类方法的作用了吗?

  • 相关阅读:
    git版本库管理介绍,撤销git pull操作
    【laravel5.4】自定义404、503等页面
    【laravel5.4】{{$name}}、{{name}}、@{{$name}} 和 @{{name}} 的区别
    python 了解一点属性的延迟计算
    python 了解一下__dict__
    excel怎么把一个sheet的 全部内容打印到一页纸上
    python 简单了解一下 描述器
    python 调用父类方法, 重写父类构造方法, 不显式调用,会报错
    Python 今天抽空学习了@Property
    python 语法糖是什么意思
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/10475204.html
Copyright © 2011-2022 走看看