美文网首页
python基础——特性

python基础——特性

作者: 一言不合就跑步 | 来源:发表于2018-12-15 14:56 被阅读0次

property特性

不能赋值,隐藏执行一段代码

class Foo:
    def __init__(self,val):
        self.__NAME=val #将所有的数据属性都隐藏起来

    @property
    def name(self):
        return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)

    @name.setter
    def name(self,value):
        if not isinstance(value,str):  #在设定值之前进行类型检查
            raise TypeError('%s must be str' %value)
        self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME

    @name.deleter
    def name(self):
        raise TypeError('Can not delete')

f=Foo('egon')
print(f.name)
# f.name=10 #抛出异常'TypeError: 10 must be str'
del f.name #抛出异常'TypeError: Can not delete'

staticmethod 静态方法

class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    @staticmethod
    def now(): #用Date.now()的形式去产生实例,该实例用的是当前时间
        t=time.localtime() #获取结构化的时间格式
        return Date(t.tm_year,t.tm_mon,t.tm_mday) #新建实例并且返回
    @staticmethod
    def tomorrow():#用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间
        t=time.localtime(time.time()+86400)
        return Date(t.tm_year,t.tm_mon,t.tm_mday)
    
a=Date('1987',11,27) #自己定义时间
b=Date.now() #采用当前时间
c=Date.tomorrow() #采用明天的时间

print(a.year,a.month,a.day)
print(b.year,b.month,b.day)
print(c.year,c.month,c.day)

静态方法本身可以作为一个函数提供给类,作为不同的初始化实例的方式

classmethod 类方法

import time
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    @staticmethod
    def now():
        t=time.localtime()
        return Date(t.tm_year,t.tm_mon,t.tm_mday)

class EuroDate(Date):
    def __str__(self):
        return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)

e=EuroDate.now()
print(e) #我们的意图是想触发EuroDate.__str__,但是结果为
'''
输出结果:
<__main__.Date object at 0x1013f9d68>
'''

因为e就是用Date类产生的,所以根本不会触发EuroDate.str,解决方法就是用classmethod

import time
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    # @staticmethod
    # def now():
    #     t=time.localtime()
    #     return Date(t.tm_year,t.tm_mon,t.tm_mday)

    @classmethod #改成类方法
    def now(cls):
        t=time.localtime()
        return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪个类来调用,即用哪个类cls来实例化

class EuroDate(Date):
    def __str__(self):
        return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)

e=EuroDate.now()
print(e) #我们的意图是想触发EuroDate.__str__,此时e就是由EuroDate产生的,所以会如我们所愿
'''
输出结果:
year:2017 month:3 day:3
'''

相关文章

  • python基础特性

    python基础特性 全局变量和局部变量 变量的作用域为变量定义所在的代码块(函数),若要在代码块内使用外部的变量...

  • python基础——特性

    property特性 不能赋值,隐藏执行一段代码 staticmethod 静态方法 静态方法本身可以作为一个函数...

  • Python入门

    Python3教程 安装Python 第一个Python程序 Python基础 函数 高级特性 函数式编程 模块 ...

  • 2019-08-10 Day 1 Python的特性

    Day 1 Python的特性 @(第一张Python基础)[MeiCheng|帮助|Markdown] Pyth...

  • Python备忘录-基础

    Python 基础知识 Python命名规则 使用 future 的特性 导入__future__ 可以在pyth...

  • python多线程

    python基础之多线程锁机制 GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析...

  • 疯狂的Python-05(神奇赋值法)

    写给有基础的Python程序员,一些有趣的鲜为人知的Python特性集合 无论你是Python新手还是Python...

  • ❖ Python OOP 面向对象编程

    参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封...

  • python基础之继承特性

    1、什么是继承 继承就是让类和类之间产生父子关系,子类可以拥有父类的静态属性和方法。[继承就是可以获取另外一个类中...

  • Python 3实战Scrapy爬取妹子图

    简介 本文不是零基础教程,你需要对Python/Python 3的基本语法和特性有一定了解,需知道如何使用pip安...

网友评论

      本文标题:python基础——特性

      本文链接:https://www.haomeiwen.com/subject/jmrahqtx.html