python 新式类学习随笔-装饰器(3)

@property

class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    @property      #引用装饰器property
    def age(self):
        return self.__age
    @age.setter    #函数修饰后可以作为装饰器使用调用后可以修改原始数据
    def age(self,value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')  #非int类型抛异常
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!') #年龄基本都是0-100以内,限制输入
        self.__age = value

s = Student('Mitsui', 24) #当age参数传入24,age会去找被property修饰的age 实际上age = self.__age而非self.age
print(s.name,s.age)       #也就是age参数会传入age()方法中的value参数,开始执行age.setter,实现规范输入的目的,
s.age = 18                #同时在调用时,把 age()方法变成一个可以赋值的属性,让调用者更加方便的调用
s.name = 'BOBO'
print(s.name)
print(s.age)            #没有赋值实际上执行了age方法下的 ‘return self.__age’

注意了:s.age   调用类内函数  实例 . 函数名   没有括号





  • 类内部普通的方法,都是以self作为第一个参数,代表着通过实例调用时,将实例的作用域传入方法内;

  • @classmethod以cls作为第一个参数,代表将类本身的作用域传入。无论通过类来调用,还是通过类的实例调用,默认传入的第一个参数都将是类本身

  • @staticmethod不需要传入默认参数,类似于一个普通的函数

class Date(object):
    def __init__(self, year=0, month=0, day=0):
        self.year = year
        self.month = month
        self.day = day
    
    @property
    def time(self):
        return "{year}-{month}-{day}".format(
            year=self.year,
            month=self.month,
            day=self.day
        )
    @classmethod
    def from_string(cls, string):
	year, month, day = map(str, string.split('-'))
	    # 在 classmethod 内可以通过 cls 来调用到类的方法,甚至创建实例
	date = cls(year, month, day)
	return date
    @staticmethod
    def is_month_validate(month):
        return int(month) <= 12 and int(month) >= 1

@property
获取传入的时间,用date.time输出(注意没有括号
>>> date = Date('2017','11','04')
>>> date.time
'2017-11-04'

@classmethod
此时就可以利用@classmethod,在类的内部新建一个格式化字符串,并返回类的实例的方法:
这样,我们就可以通过Date类来调用from_string方法创建实例,并且不侵略、修改旧的实例化方式
>>> date = Date.from_string('2017-11-04')
>>> date.time
'2017-11-04'
>>> date_old = Date('2017','11','04')
>>> date.time
'2017-11-04'

好处:

  • 在@classmethod内,可以通过cls参数,获取到跟外部调用类时一样的便利

  • 可以在其中进一步封装该方法,提高复用性

  • 更加符合面向对象的编程方式


@staticmethod

而@staticmethod,因为其本身类似于普通的函数,所以可以把和这个类相关的 helper 方法作为@staticmethod,放在类里,然后直接通过类来调用这个方法(不需要制定实例,date = Date())
>>> Date.is_month_validate(22)
False
>>> Date.is_month_validate(3)
True







  • 类内部普通的方法,都是以self作为第一个参数,代表着通过实例调用时,将实例的作用域传入方法内;

  • @classmethod以cls作为第一个参数,代表将类本身的作用域传入。无论通过类来调用,还是通过类的实例调用,默认传入的第一个参数都将是类本身

  • @staticmethod不需要传入默认参数,类似于一个普通的函数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值