python3类中的装饰方法如何选择?

python

python中的方法不怕多,就怕难于选择。因为如果概念不清楚的话,光从表面上看难以分出伯仲,所以学习相关的基本概念已经刻不容缓了。装饰方法这一块,大家都有一些了解,小编本篇会着重于两种方法的对比上,基础概念的介绍不会很多。小伙伴们学习的时候可以用心对比出两者的不同。


@classmethod 用来修饰方法。使用在实例化前与类进行交互,但不和其实例进行交互的函数方法上。

 @staticmethod 用来修饰类的静态方法。使用在有些与类相关函数,但不使用该类或该类的实例。如更改环境变量、修改其他类的属性等。

 两者最明显的区别,classmethod 必须使用类的对象作为第一个参数,而staticmethod则可以不传递任何参数

 

1、@classmethod 类方法

类方法,我们不用通过实例化类就能访问的方法。而且@classmethod 装饰的方法不能使用实例属性,只能是类属性。它主要使用在和类进行交互,但不和其实例进行交互的函数方法上。

下面,我们要写一个只在类中运行而不在实例中运行的方法。

简单示例,读取私有化类属性数据,如下:

class Circle(object):

   __pi = 3.14

 

   def __init__(self, r):

       self.r = r

 

   @classmethod

   def pi(cls):

       return cls.__pi

 

   def area(self):

       """

圆的面积

       """

       return self.r ** 2 * self.__pi

 

print(Circle.pi())  # 没有实例化 能直接访问pi() 方法

circle1 = Circle(2)

print(circle1.pi()) # 也可以通过实例访问pi()方法


2、@staticmethod 静态方法

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

 @staticmethod使用在有些和类相关函数,但不使用该类或者该类的实例。如更改环境变量、修改其他类的属性等。

一句话@staticmethod 修饰的方法是放在类外的函数,我们为了方便将他移动到了类里面,它对类的运行无影响。

示例:

class Date(object):

   day = 0

   month = 0

   year = 0

 

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

       self.day = day

       self.month = month

       self.year = year

 

   @classmethod

   def from_string(cls, date_as_string):

       year, month, day = date_as_string.split('-')

       date = cls(year, month, day)

       return date

 

   @staticmethod

   def is_date_valid(date_as_string):

       """

      用来校验日期的格式是否正确

       """

       year, month, day = date_as_string.split('-')

       return int(year) <= 3999 and int(month) <= 12 and int(day) <= 31

 

date1 = Date.from_string('2012-05-10')

print(date1.year, date1.month, date1.day)

is_date = Date.is_date_valid('2012-09-18') # 格式正确 返回True


两种装饰方法的比较已经写得很全面了,不同的地方相信大家都能找出来并牢记。其他更多的相关拓展,会在以后的文章里面涉及,小伙伴们阅读的时候可以多加留意。

以上是 python3类中的装饰方法如何选择? 的全部内容, 来源链接: utcz.com/z/529686.html

回到顶部