python类方法,静态方法,实例方法,私有属性

python中,类方法(@classmethod)和静态方法(@staticmethod)都是为了对类参数进行一些预处理的过程,

方便使用不同参数对类的调用

 

静态方法:

class Date:

    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __str__(self):
        return '{year}/{month}/{day}'.format(year=self.year, month=self.month, day=self.day)
    @staticmethod
    def parse_from_string(date_str):     #虽然是定义在类的内部,但静态方法不需要用self参数,即不用实例本身作为参数
        year, month, day = tuple(re.split(r'-|\.', date_str))
        return Date(int(year), int(month), int(day))     #当类的名字更改时,此处名字也要改。为了解决这个问题,所以要使用类方法

          # 当实例化Date时,使用parse_from_string方法,传入的参数可以接收单个字符串,然后再拆分成三个参数给

             构造函数__init__来生成实例,如下面:

if __name__ == '__main__':

        date_str = '2008-1-1'

        new_day = Date.parse_from_string(date_str)

        print(new_day)                                      //    打印2008/1/1

 


类方法:

如上所说,静态是可以提前处理类的传入参数。静态方法不一定要返回类本身,即静态方法可以return 其他东西(如字符串,布尔值等)。但当静态方法要返回类本身的时候,如上面的例子,如果修改定义的类名,也要对静态方法中的类名进行修改。为了避免这一个问题,可以采用类方法:

class Date:

    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __str__(self):
        return '{year}/{month}/{day}'.format(year=self.year, month=self.month, day=self.day)
    @classmethod
    def parse(cls, date_str):       #与静态方法实现同样的功能,只是要添加类本身的参数,这里的cls不是固定的,可以用其他变量来替换
        year, month, day = tuple(re.split(r'-|\.', date_str))
        return cls(int(year), int(month), int(day))

         # 当实例化Date时,使用parse方法,传入的参数可以接收单个字符串,然后再拆分成三个参数给

            构造函数__init__来生成实例,如下面:

if __name__ == '__main__':

        date_str = '2008-1-1'

        new_day = Date.parse(date_str)

        print(new_day)

 


私有属性

 

python中,通过在属性前添加双下划线可以让一个类变量或者方法变成私有,外面是“不能”访问该属性,继承该类的子类也不能访问。注意,并不是绝对的不能访问,可能通过另外一个方法来访问到定义的私有属性(实例名._类名.带双下划线的私有属性名)

class User:
    def __init__(self, birthday):
        self.__birthday = birthday   # __birthday就是私有属性

    def get_age(self):
        return datetime.date.today().year - self.__birthday.year


if __name__ == '__main__':
    user = User(Date(2000, 1, 1))
    print(user.__birthday)       # 报错,提示没有该属性
    print(user._User__birthday)  # 正常打印2001/1/1
    print(user.get_age())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值