由于时间关系,我就直接拿例子来作说明算了。
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]"
是不是很方便呢?