楼主: jpld
1512 0

[原创博文] 《Python基础教程》 读书笔记 第九章 魔法方法、属性和迭代器 9.5属性 [推广有奖]

  • 2关注
  • 50粉丝

讲师

2%

还不是VIP/贵宾

-

威望
0
论坛币
1268 个
通用积分
2.1233
学术水平
120 点
热心指数
120 点
信用等级
99 点
经验
1249 点
帖子
192
精华
0
在线时间
271 小时
注册时间
2009-5-29
最后登录
2022-3-1

楼主
jpld 发表于 2015-10-21 22:18:26 |只看作者 |坛友微信交流群|倒序 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

__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)在这里,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参数是自动被绑定到类的:

__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)

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

__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__

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

__getattribute__(self.name):当特性name被访问时自动被调用
__getattr__(self
,name):当特性name被访问且对象没有相应的特性时被自动调用
__setattr__(self.name.value):当时图给特性name赋值是会被自动调用
__delattr__(self
,name):当试图删除特性name是被自动调用继续rectangle的例子:、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

系列学习笔记请移步:

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python基础教程 Python基础 python 读书笔记 基础教程 读书笔记

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 02:28