面向对象

场景一

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

    @classmethod
    def get_date(cls, data_as_string):
        # 这里第一个参数是 cls,  表示调用当前的类名
        year, month, day = map(int, string_date.split('-'))
        date = cls(year, month, day)
        # 返回的是一个初始化后的类
        return date

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

在 Date_test 类里面创建一个成员函数, 前面用了 @classmethod 装饰. 它的作用就是有点像静态类, 比静态类不一样的就是它可以传进来一个当前类作为第一个参数 (注意是当前类, 不是当前实例), 另外, 这个参数也是多态的, 即如果是子类调用, 那么这个参数就是子类.

调用:

r = Data_test.get_date('2016-8-6')
r.out_date()

输出:

year :
2016
month :
8
day :
1

这样子等于先调用 get_date() 对字符串进行出来, 然后才使用 Data_test 的构造函数初始化.

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

场景二

例如一个 User 类对应数据库中的 user 表. 并且有一个 where 方法, 其作用相当于 sql 的 select * from table where ..., 此时, 这个 where 方法就可以作为 @classmethod:

class User():
    @classmethod
    def where(cls):
        pass

这样, 就可以直接通过调用 User.where() 来取得数据库中的所有用户对象, 而不需要新建一个 User 类的对象之后再调用这个方法.

Last updated