Python中的私有标识符、switch语句以及枚举类型

由于时间关系,我就直接拿例子来作说明算了。

class A():
    p=1.0
    @classmethod
    def get_p(cls):
        return cls.p
class B(A):
    p=2.0
class C():
    _p=1.0
    @classmethod
    def get_p(cls):
        return cls._p
class D(C):
    _p=2.0
class E():
    __p=1.0
    @classmethod
    def get_p(cls):
        return cls.__p
class F(E):
    __p=2.0

像上面这样定义了六个类,
调用B.get_p(), D.get_p(), F.get_p()后返回的值是2.0, 2.0, 1.0
原因是以__(双下划线)开头的变量被认为是“私有变量”,相当于C#中的private,不能被在其它类中定义的函数访问到。
而以_(单下划线)开头的变量被认为是弱的“内部使用”,相当于C#中的internal,可以在相关的这些类中访问。
如果不是以下划线开头的变量其实就是一个类的属性。
(记下这个就是告诉自己要记住编码规范。

//C#
switch(key)
{
    case 1: Work1(x, y); break;
    case 2: Work2(x, y); break;
    case default: WorkDefault(x, y); break;
}
# Python
worklist = {1:lambda:Work1(x, y), 2:lambda:Work2(x, y),
    '':lambda:WorkDefault(x, y)}
worklist.get(key, worklist[''])()

今天写到一个需要用到类似C#中的swtich语句的地方,才反应过来Python并没有类似的语句,不过可以用像上面写的这几句这样用字典+lambda表达式轻松搞定。
那个default我这里用的是空字符串'',其实用什么都可以的。。

在C#之类的语言中有种Python没有的叫做枚举类型的东西:

//C#
enum Season {Spring, Summer, Autumn, Winter};

在Python中该怎么实现呢?

# 方法一:
Class Season():
    Spring = 0
    Summer = 1
    Autumn = 2
    Winter = 3
some_season = Season.Spring
# 相当于用了一个叫做Season的类(也可以不用类)定义了几个常量
# 实际上是用数字来区分各种季节。

# 方法二:
Class Spring():
    pass
Class Summer():
    pass
Class Autumn():
    pass
Class Winter():
    pass
some_season = Spring
# 相当于用空的类(的指针)来代表某一个季节,好处是可以像这样进行一些扩展:
Class Season():
    _months = []
    @classmethod
    def get_months(cls):
        return cls._months
Class Spring():
    _months = [3, 4, 5]
Class Summer():
    _months = [6, 7, 8]
Class Autumn():
    _months = [9, 10, 11]
Class Winter():
    _months = [12, 1, 2]
# 这就是本文最前面讲的东西的应用啦。
# 这样定义出来的枚举类型显然更加灵活一些,使用起来可以像这样:
some_season = Spring
another_season = Winter
thethird_season = Winter
print some_season is another_season
# get "False"
print thethird_season is another_season
# get "True"
print some_season.get_months()
# get "[3, 4, 5]"

是不是很方便呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注