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__这个方法

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

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20767.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论