前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器 9.5属性

《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器 9.5属性

作者头像
统计学家
发布2019-04-10 10:06:03
2470
发布2019-04-10 10:06:03
举报

9.5属性

如果在访问给定的特性时必须要采取一些行动,那么像这样的封装状态变量就很重要。

class Rectangle: def __init__(self): self.width=0 self.height=0 def setSize(self,size): self.width,self.height=size def getSize(self): return self.width,self.height

>>>r=Rectangle()

>>>r.width=10

>>>r.height=5

>>>r.getSize()

(10,5)

>>>r.setSize((150,100))

>>>r.width

150

9.5.1property函数

Property函数使用简单,只需在上述rectangle类上增加一行代码比如:子类化object或者使用__metclass__=type

代码语言:javascript
复制
__metclass__=type
class Rectangle:
    def __init__(self):
        self.width=0
        self.height=0
    def setSize(self,size):
        self.width,self.height=size
    def getSize(self):
        return self.width,self.height
    size=property(getSize,setSize)
代码语言:javascript
复制
在这里,property创建了一个属性,其中访问器函数被用做参数,这个属性命为size

>>>r=Rectangle()

>>>r.width=10

>>>r.height=5

>>>r.size

(10,5)

>>>r.size=150,100

>>>r.width

10

9.5.2静态方法和类成员方法

静态方法的定义没有self参数,且能够被类本身直接调用,类方法在定义时需要名为cls的类似于self的参数,类成员方法可以直接用类的具体对象调用,但cls参数是自动被绑定到类的:

代码语言:javascript
复制
__metclass__=type
class Myclass:
    def smeth():
        print 'this is a static method'
    smeth=staticmethod(smeth)

    def cmeth(cls):
        print 'this is a class method of',cls
    cmeth=classmethod(cmeth)

这样有些单调,其实可以使用装饰器,使用@操作符,在方法的上方将装饰器列出,从而制定一个或者更多的装饰器

代码语言:javascript
复制
__metclass__=type
class Myclass:
    @staticmethod
    def smeth():
        print 'this is a static method'
    @classmethod
    def cmeth(cls):
        print 'this is a class method of',cls

运行结果都是一样的

>>>Myclass.smeth()

thisis a static method

>>>Myclass.cmeth()

thisis a class method of __builtin__.Myclass

9.5.3__getattr__、__setattr__

拦截对象的所有特性访问是可能的,这样可以用旧式类实现属性

代码语言:javascript
复制
__getattribute__(self.name):当特性name被访问时自动被调用
__getattr__(self,name):当特性name被访问且对象没有相应的特性时被自动调用
__setattr__(self.name.value):当时图给特性name赋值是会被自动调用
__delattr__(self,name):当试图删除特性name是被自动调用
代码语言:javascript
复制
继续rectangle的例子:、
代码语言:javascript
复制
class Rectangle:
    def __init__(self):
        self.width=0
        self.height=0
    def __setattr__(self, name, value):
        if name=='size':
            self.width,self.height=value
        else:
            self.__dict__[name]=value
    def __getattr__(self, name):
        if name=='size':
            return  self.width,self.height
        else:
            raise AttributeError
代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档