首页 > 技术文章 > 使用@property 添加width 和 height 属性

FWF1944 2019-05-16 21:38 原文

@property
Python内置的@property装饰器就是负责把一个方法变成属性调用的:

 

class Screen(object):
     def isint(self,px):
        if not isinstance(px,int):
             raise ValueError('px must be an int')
        if px<0 :
             raise ValueError('px must be not a negative number')
    
     @property
     def width(self):
         return self._width
     
     @width.setter
     def width(self,value):
         self.isint(value)
         self._width=value
         
     @property
     def height(self):
         return self._height
     
     @height.setter
     def height(self,value):
         self.isint(value)
         self._height=value
         
     @property
     def resolution(self):
         return self._width * self._height

 

@property给一个Screen对象加上width和height属性,以及一个只读属性resolution:

 

>>> s=Screen()
>>> s.width=666
>>> s.height=888
>>> print(s.resolution)
591408
>>> print('s.width * s.height =%d? ' % s.resolution)
s.width * s.height =591408? 
>>> print('s.width * s.height =%d  ' % s.resolution)
s.width * s.height =591408  
>>>
#题目: 请利用@property 给一个 Screen 对象加上 width 和 height 属性,以及一个只#读属性 resolution。 
#示例: 
class Screen(): 
pass 
#test: 
s=Screen() 
s.width=1024 
s.height=768 
print(s.resolution) 
786432

答案:

class Screen(object) :
    @property
    def width(self) :
        return self._width

    @width.setter
    def width(self,valuer) :
        if not isinstance(valuer,int):
            raise ValueError('score must be an integer')
        if valuer < 0 :
            raise ValueError('score must over zero')    
        self._width=valuer

    @property
    def height(self) :
        return self._height

    @height.setter
    def height(self,number) :
        if not isinstance(number,int) :
            raise ValueError('score must be an integer')
        if number < 0 :
            raise ValueError('score must be an zero')
        self._height = number

    @property
    def resolution(self):
        return self._width * self._height

s=Screen()
s.width = 1024
s.height = 768
print(s.resolution)     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
解析: 
其实这个答案整体很好理解的,思路也很清晰 , 结构也并不复杂,但是需要细心 , 我一开始就因为没细心所以造成了细节上的不必要的错误。 
这段代码比较复杂的地方是第4行和16行,其实把

return self._width
1
换成

return self.kuandu
1
也可以,self.(可以命名成你想定义的名字),但是不能在原来代码的基础上直接去掉下划线,这样运行结果会进入死循环。同时建议自定义命名的话最好加上下划线,至于为什么这样做,我还需要再思考一下原理,最近休息不好脑袋萌萌的。如果想通了 ,我会更新出来的。如果对代码有其他不清楚的地方可以留下评论,我会尽量经常上来查看一下。

 

推荐阅读