Python类:__dict__/@classmethod

Python中的类中__dict__方法

感谢:Tarzen博客园
研究了半天,发现调用json模块只是为了让原本一行打印不下的dict换行打印而已…优雅!实在是太优雅了!

import json

class A(object):

    a = 0
    b = 1

    def __init__(self):
        self.b = 3
        self.a = 2

    def test(self):
        print('a normal func.')

    @staticmethod
    def static_test(self):
        print('a static func.')

    @classmethod
    def class_test(self):
        print('a calss func.')


obj = A()
print(A.__dict__)
print(obj.__dict__)
print(json.dumps(obj.__dict__, indent=2))
print(json.dumps(obj.__dict__, indent=2, sort_keys=True))

运行结果:

{'__module__': '__main__', 'a': 0, 'b': 1, '__init__': <function A.__init__ at 0x0000023B6AF31700>, 'test': <function A.test at 0x0000023B6835F5E0>, 'static_test': <staticmethod object at 0x0000023B68302190>, 'class_test': <classmethod object at 0x0000023B68302160>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{'b': 3, 'a': 2}
{
  "b": 3,
  "a": 2
}
{
  "a": 2,
  "b": 3
}

相关知识点:JackLiu16
indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据;否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json
sort_keys:将数据根据keys的值进行排序

Python中的@classmethod的作用

感谢:謹言
classmethod修饰符对应的函数不需要实例化,不需要self参数,但第一个参数需要是表示自身类的cls参数,可以来调用类的属性、类的方法、实例化对象等。

实例1:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class A(object):

    bar = 1
    
    def func1(self):  
        print ('foo') 
        
    @classmethod
    def func2(cls):
        print ('func2')
        print (cls.bar)
        cls().func1()   # 调用 foo 方法
 
A.func2()               # 不需要实例化

运行结果:

func2
1
foo

@classmethod的作用实际是可以在class内实例化class,一般使用在有工厂模式要求时。比如,输入的数据需要清洗一遍再实例化,可以把清洗函数定义在class内部并加上@classmethod装饰器以达到减少代码的目的。总结起来就是:@classmethod可以用来为一个类创建一些预处理的实例。

实例2:
定义如下的一个时间类。

class Data_test(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
        
    def out_date(self):
        print("year :",self.year)
        print("month :",self.month)
        print("day :",self.day)
        
t=Data_test(2020,1,1)
t.out_date()

运行结果:

year : 2020
month : 1
day : 1

符合期望。
继续,如果用户输入的是“2016-8-1”这样的字符格式,那么就需要调用Date_test类前做一下处理:

string_date='2020-1-1'
year,month,day=map(int,string_date.split('-'))
s=Data_test(year,month,day)

先把“2020-1-1”分解成year,month和day三个变量,然后转成int,再调用Date_test(year,month,day)函数,也很符合期望。
那我可不可以把这个字符串处理的函数放到Date_test类当中呢?此时@classmethod就开始出场了:

class Data_test2(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 get_date(cls,data_as_string):
       #这里第一个参数是cls, 表示调用当前的类名
       year,month,day=map(int,data_as_string.split('-'))
       date1=cls(year,month,day)     #返回的是一个初始化后的类
       return date1

   def out_date(self):
       print("year :",self.year)
       print("month :",self.month)
       print("day :",self.day)

在Date_test类里面创建一个成员函数,前面用了@classmethod装饰。它的作用就是有点像静态类,与静态类不一样的就是它可以传进来一个当前类作为第一个参数。那么如何调用呢?

r=Data_test2.get_date("2020-1-1")
r.out_date()

运行结果:

year : 2020
month : 1
day : 1

这样的好处就是你以后重构类的时候不必修改构造函数,只需要额外添加你要处理的函数,然后使用装饰符@classmethod就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值