请利用@property给一个Screen对象加上widthheight属性,以及一个只读属性resolution

写了一段代码

class Screen(object):
#利用property装饰器负责把width方法变成属性调用
@property
def width(self):
return self._width
#定义setter方法变成可读属性,如果不定义getter方法,就是只读属性
@width.setter
def width(self, value):
self._width = value
#同width
@property
def height(self):
return self._height
#同width
@height.setter
def height(self, value):
self._height = value
#将resolution变成一个只读属性,并打印出来
@property
def resolution(self):
print("%s * %s == %d" %(self._width, self._height, self._width*self._height))

测试一下,#test

s = Screen()
s.width = 1024
s.height = 768
s.resolution

输出结果:

1024 * 768 == 786432

上面是一个简单没有进行属性控制的语句,能够实现功能,但在网上看到另外一种情况,就是要对相关方法属性进行raise抛出异常操作

增加了一个@staticmethod 静态方法,觉得挺好,后来又看到了除了staticmethod静态方法还有classmethod类方法,在这里也普及一下

改进后的代码

class Screen(object):
def __init__(self):
self._height = 0
self._width = 0 @staticmethod
def _check_param(value):
if not isinstance(value, int):
raise TypeError('必须是一个整数类型!')
if value <= 0:
raise ValueError('必须是大于0的数!') #利用property装饰器负责把width方法变成属性调用
@property
def width(self):
return self._width
#定义setter方法变成可读属性,如果不定义getter方法,就是只读属性
@width.setter
def width(self, value):
self._check_param(value)
self._width = value
#同width
@property
def height(self):
return self._height
#同width
@height.setter
def height(self, value):
self._check_param(value)
self._height = value
#将resolution变成一个只读属性,并打印出来
@property
def resolution(self):
print("%s * %s == %d" %(self._width, self._height, self._width*self._height))

测试一下:

s = Screen()
s.width = -1024

输出:ValueError: 必须是大于0的数!

接下来看一下之前的问题staticmethod和classmethod方法,参考:http://www.cnblogs.com/Tony-zhangl/p/4687889.html

static method定义:静态方法是一类特殊的方法。有时,你想写一些属于类的代码,但又不会去使用和这个类任何相关的东西。(很抽象),基本上和一个全局函数差不多,可以通过类或者类的实例对象进行调用,不会隐式地传入任何参数。

class method定义:什么是类方法,类方法不是绑定到类的实例上去的,而是绑定到类上去的.(也很抽象),是和一个class类相关的方法,可以通过类或类实例进行调用,并将该class对象(不是class的实例对象)隐式地当作第一个参数传入。

区别:类方法需要额外的类变量cls,调用类方法传入的类变量cls是子类,而不是父类。类方法和静态方法都可以通过类对象和类的实例对象访问。

class MyClass(object):
var = "test for myclass" @classmethod
def clsmethod(cls):
print(cls.var)
@staticmethod
def sticmethod():
print(MyClass.var)

s = MyClass()
s.clsmethod()
s.sticmethod()

输出结果

s.clsmethod()
test for myclass

s.sticmethod()  
test for myclass

另外一个显然的对比例子如下

class ParentClass(object):

    var = "test for parent"

    @classmethod
def clsmethod(cls):
print cls.var class SubClass(ParentClass): var = "test for sub"

此时ParentClass.clsmethod输出为 “test for parent”,而Subclass.clsmethod输出为“test for sub”,通过此比较很好的诠释了@classmethod类方法隐式传入的第一个参数是当前类,而不是父类。同时类方法操作的是class 类对象提供的内部信息。而staticmethod可以作为一般的工具函数来使用。

【练习】@property练习题的更多相关文章

  1. iOS:练习题中如何用技术去实现一个连线题

    一.介绍 本人做的app涉及的是教育行业,所以关于练习题的开发肯定是家常便饭.例如,选择题.填空题.连线题.判断题等,每一种题型都需要技术去实现,没啥多大难度,这里呢,就给出实现连线题的核心代码吧.过 ...

  2. FCC---Use the CSS Transform scale Property to Scale an Element on Hover

    The transform property has a variety of functions that let you scale, move, rotate, skew, etc., your ...

  3. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  4. JavaScript特性(attribute)、属性(property)和样式(style)

    最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...

  5. -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HO 解决办法

    最近在使用maven,项目测试的时候出现了这么一个错.-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2 ...

  6. python property理解

    一般情况下我这样使用property: @property def foo(self): return self._foo # 下面的两个decrator由@property创建 @foo.sette ...

  7. Android动画效果之Property Animation进阶(属性动画)

    前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...

  8. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  9. # ios开发 @property 和 Ivar 的区别

    ios开发 @property 和 Ivar 的区别 @property 属性其实是对成员变量的一种封装.我们先大概这样理解: @property = Ivar + setter + getter I ...

随机推荐

  1. [Leetcode 105]*前序后序遍历形成树

    public TreeNode find(int[] preorder, int[] inorder,int j, int start, int end) { if (j > preorder. ...

  2. LNMP(二)

    第二十一课 LNMP(二) 目录 一.默认虚拟主机 二.Nginx用户认证 三.Nginx域名重定向 四.Nginx访问日志 五.Nginx日志切割 六.静态文件不记录日志和过期时间 七.Nginx防 ...

  3. obspy下载地震波数据

    Retrieving Data from Data Centers(从数据中心检索数据) PS:此部分提供了使用obspy下载数据的推荐方式,但是由于数据中心和web服务在不断更新变化,所有有些建议可 ...

  4. SharePoint REST API - 使用REST接口对列表设置自定义权限

    博客地址:http://blog.csdn.net/FoxDave SharePoint网站.列表和列表项都属于SecurableObject类型.默认情况下,一个安全对象继承父级的权限.对一个对 ...

  5. HTTP,RFC自学心得

    HTTP协议描述的是:发送方与接收方的通信协议,通过两方的自觉遵守而存在,当然有不少的浏览器并没有百分百遵守这份协议. HTTP是运行于应用层的协议,基于TCP协议而运作.基本上是客户/服务器对答模式 ...

  6. Alpha冲刺10

    前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/10045588.html 作业博客:https://edu.cnblogs.com/campus ...

  7. NotePad++配置使之支持jquery、html、css、javascript、php提示

    1.将以下文件复制到Notepad++\plugins\apis覆盖之前的xml文件 javascript.xml html.xml css.xml   2.打开notepad++设置>首选项& ...

  8. Front-end: Using blurred backgrounds with contents unaffected.

    Purpose: Using a picture as the background of a page with blurred effect, while the content not blur ...

  9. mount: mounting proc on /proc failed: Device or resource busy

    /********************************************************************** * mount: mounting proc on /p ...

  10. MVC+三层+ASP.NET简单登录验证

    通过制作一个登录小案例来搭建MVC简单三层 在View --Shared下创建一个母版页: <!DOCTYPE html> <html> <head> <me ...