澳门太阳娱乐集团官网-太阳集团太阳娱乐登录

太阳集团太阳娱乐登录【python】Python 中的 class
分类:脚本专栏

一、classmethod介绍

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

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

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

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

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

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

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

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

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

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

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

错误如下

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

下面在看下正确的例子

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

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

可以正常输出结果

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

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

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

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

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

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

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

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

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

原文是stackoverflow的一则高票回答,原文链接
可能之前也有人翻译过,但是刚好自己也有疑惑,所以搬运一下,个人水平有限所以可能翻译存在误差,欢迎指正(如侵删)。

Python 中的 classmethod 和 staticmethod 有什么具体用途?

推荐地址:

 




 

二、__getattr__介绍

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

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

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

a = test_attrprintprint

结果如下

sdb+dsbdsb

分析

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

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

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

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


尽管classmethodstaticmethod非常的相似,但是两者在具体的使用上还是有着细微的差别:classmethod必须使用类对象作为第一个参数,而staticmethod则可以不传递任何参数。

让我们通过实际的例子来看看。

样板

让我们假设有处理日期信息的类:

class Date(object):
    day = 0
    month = 0
    year = 0

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

这个类很显然可以被用来存储某些日期信息(不考虑时区信息;让我们假设所有的日期都用UTC表示)

这里定义了__init__,典型的类实例初始化方法,它作为典型的instancemethod接受参数,其中第一个传递的必要参数是新建的实例本身。

类方法

有一些可以通过使用classmethod很好解决的任务。

假设我们有很多('dd-mm-yyyy')格式字符串的日期信息,想要把它们创建成Date类实例。我们不得不在项目的不同地方做这些事情。

所以我们必须要做到:

  1. 分析得到的年月日字符串,把它们转化成三个整形变量或者拥有三个元素的元组的变量。
  2. 通过传递这些值实例化Date

得到:

day, month, year = map(int, string_date.split('-'))
date1 = Date(day, month, year)

C++拥有重载的特性可以达到这种目的,但是Python缺乏此类特性。所以,python使用classmethod的方式。让我们尝试一种另类的构造函数。

    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

date2 = Date.from_string('11-09-2012')

进一步分析一下以上代码的执行,以及它的优势:

1.在一个地方解析日期字符串并且重复使用它。
2.做到很好的封装(相对于把执行字符串解析作为一个单独的函数在任何地方执行,这里使用的方法更符合OOP的范式)
3.cls表示类对象,而不是类实例。这样很酷,因为如果我们继承Date类,那么所有的子类也都将拥有from_string这个方法。

静态方法

那么staticmethod又是什么呢?它和classmethod非常的相似,但是不强制要求传递参数(但是做的事与类方法或实例方法一样)。

让我们来看一个使用的例子。

我们有一个日期字符串需要以某种方式验证。这个任务与之前一样要定义在Date类内部,但是不要求实例化它。

静态方法在这种情况下就非常有用。看一下下面这个代码片段:

    @staticmethod
    def is_date_valid(date_as_string):
        day, month, year = map(int, date_as_string_split('-'))
        return day <= 31 and month <= 12 and year <= 3999

    is_date = Date.is_date_valid('11-09-2012')

现在正如我们了解到的staticmethod的使用,我们不需要访问它所属的类,它本质上就是一个函数,调用方式和调用函数一样,不同的是它不关注对象和对象内部属性。

本文由澳门太阳娱乐集团官网发布于脚本专栏,转载请注明出处:太阳集团太阳娱乐登录【python】Python 中的 class

上一篇:没有了 下一篇:没有了
猜你喜欢
热门排行
精彩图文