Python单例设计模式,枚举,JSON

Python单例设计模式,枚举,JSON

1.单例设计模式

1.1__new__函数的使用

__new__函数属于类函数,在创建对象时调用。

class Car(object):
    def __new__(cls, *args, **kwargs):
        print("这是new函数")
        #在new函数后返回当前这个类的对象,不返回则自动返回None
        return super(Car,cls).__new__(cls)  #或使用 object.__new__(cls)
    def __init__(self):
        print("这是init函数")

car = Car()
1.2 什么是单例设计模式

单例模式指的是在应用整个生命周期内只能存在一个实例 。

1.3单例设计模式案例
class GetData(object):
    
    __obj = None
    def __new__(cls, *args, **kwargs):
        #判断对象是否被创建
        if cls.__obj == None:
             cls.__obj = super(GetData,cls).__new__(cls)

        return cls.__obj

    def __init__(self,name):
        self.name = name
        print("获取数据:"+self.name)

data = GetData("张三")
print(id(data))
data1 = GetData("李四")
print(id(data1))

2.枚举类型

2.1什么是枚举类型

枚举类可以方便地表示星期,月份等常数类型,如果你不用枚举类,那么你只能用数字或者字符串。如果你使用数字,用1-7来表示星期数,但一个数字在程序中不仅可以表示星期数,可能还有其他许多含义,这样你在写程序时就必须时刻记住这些数字的含义,这降低了程序的可读性,也导致容易出错。而当你使用字符串时,虽然没有明显的缺点,但在内存中字符串所占内存要比数字多,这就降低了程序的效率。

枚举类正好弥补了这两方面的缺点,你可以在代码中使用枚举类,但在内存中存放时使用的是数字,既提高了可读性,又提高了程序效率。更重要的是,Python中的枚举类型是不可变类型,又可以进行迭代,这就意味着你可以随时使用枚举类型而不用担心改变了枚举类型的值

2.2枚举类型使用

定义

定义枚举要导入enum模块 ,使用 class关键字,继承Enum类

from enum import Enum

class Color(Enum):
    #定义类属性,名称为Color.red.......
    red = 1
    yellow = 2
    green = 3
    blue = 4
    blue2 = 9

注意:定义枚举时,成员不允许重复,报错: 提示错误:TypeError: Attempted to reuse key: ‘***’

但是值可以相同,第二个成员的名称被视作第一个成员的别名

使用

通过成员的名称来获取成员 Color['red']

通过成员值来获取成员 Color(2)

通过成员,来获取它的名称和值

red_member = Color.red
red_member.name
red_member.value

使用循环获取成员

class Color(Enum):
    red = 1
    red1 = 1
    yellow = 2
    green = 3
    blue = 4
for color in Color:
    print(color) #如果要获取值,使用color.value
结果:
Color.red
Color.yellow
Color.green
Color.blue

如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员

使用特殊属性__members__遍历重复值

for color in Color.__members__.items():    
	print(color)#可使用color[0]或[1]获取成员名称,使用color[1].value获取成员值

枚举类型比较

Color.red is Color.red # True 
Color.red is not Color.blue #True 
Color.blue == Color.red #False
Color.blue != Color.red #True

注意:不可进行大小比较,但可以使用value比较,如:Color.red.value <= Color.yellow.value

2.3 装饰器@unique

如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】

from enum import Enum,unique
@unique #限制成员和值不可重复,否则直接报错
class Color(Enum):
    red = 1
    red1 = 1
    yellow = 2
    green = 3
    blue = 4

3.JSON

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式 。 Python3 中可以使用 json 模块来对 JSON 数据进行编解码 。

  • json.dumps(): 对数据进行编码。
  • json.loads(): 对数据进行解码。

通过示例认识json:

#data为python中的字典类型
data = {
    'no': 1,
    'name': 'baidu',
    'url': 'http://www.baidu.com',
    'title': None,
    'dianji':True
}
print(data)
json_str = json.dumps(data) #将字典类型转换为json字符串,可以会用indent属性进行代码缩进整理
print(json_str)
data2 = json.loads(json_str) #将json字符串转换为python字典类型

#在python的字典类型中来访问某个属性的值
print ("data2['name']: ", data2['name'])
print ("data2['url']: ", data2['url'])


输出结果:
#python字典类型
{'no': 1, 'name': 'baidu', 'url': 'http://www.baidu.com', 'title': None, 'dianji': True}
#json字符串
{"no": 1, "name": "baidu", "url": "http://www.baidu.com", "title": null, "dianji": true}

Python 编码为 JSON 类型转换对应表:

在这里插入图片描述

JSON 解码为 Python 类型转换对应表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们后面会讲到从json文件中读取json

4.伪三目运算符

在python中不存在三目运算符,但是可以通过if...else...模拟这种行为。

if...else
#条件为Treu时结果 if 条件判断 else 条件为False时结果
print('张三' if 1>2  else '李四')


and... or...
#条件 and 条件为Treu时结果 or 条件为False时结果
print(2 < 1 and 'True' or 'False')



5.练习

练习1:

使用单例模式实现

练习2:

使用枚举类型定义春夏秋冬四个季节,并根据用户输入月份判断是哪个季节。

练习3:

读取json文件并转换为python中的字典类型,输出其中某块儿内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值