【练习】@property练习题
请利用@property给一个Screen对象加上width和height属性,以及一个只读属性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练习题的更多相关文章
- iOS:练习题中如何用技术去实现一个连线题
一.介绍 本人做的app涉及的是教育行业,所以关于练习题的开发肯定是家常便饭.例如,选择题.填空题.连线题.判断题等,每一种题型都需要技术去实现,没啥多大难度,这里呢,就给出实现连线题的核心代码吧.过 ...
- 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 ...
- 探究@property申明对象属性时copy与strong的区别
一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...
- JavaScript特性(attribute)、属性(property)和样式(style)
最近在研读一本巨著<JavaScript忍者秘籍>,里面有一篇文章提到了这3个概念. 书中的源码可以在此下载.我将源码放到了线上,如果不想下载,可以直接访问在线网址,修改页面名就能访问到相 ...
- -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HO 解决办法
最近在使用maven,项目测试的时候出现了这么一个错.-Dmaven.multiModuleProjectDirectory system property is not set. Check $M2 ...
- python property理解
一般情况下我这样使用property: @property def foo(self): return self._foo # 下面的两个decrator由@property创建 @foo.sette ...
- Android动画效果之Property Animation进阶(属性动画)
前言: 前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画 ...
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- # ios开发 @property 和 Ivar 的区别
ios开发 @property 和 Ivar 的区别 @property 属性其实是对成员变量的一种封装.我们先大概这样理解: @property = Ivar + setter + getter I ...
随机推荐
- 1.HTML初识
一.认识什么是纯文本文件txt windows中自带一个软件,叫做记事本,记事本保存的文档格式就是txt格式,就是英语text的缩写,术语上,称呼这个文件为"纯文本格式" .doc ...
- 4 Django应用 第3部分(视图部分)
接着昨天写的那篇笔记,今天继续学习DJango中的内容.这一章主要是介绍Django中的视图部分. 4.1视图理念 4.2编写第一个视图 4.3编写更多的视图 4.4给视图编写功能 4.5render ...
- 2、AngularJs 过滤器($filter)
1.内置过滤器: currency ({{123|currency}}) date (medium\short\fullDate\longDate\mediumDate\shortDate\mediu ...
- vscode下调试运行c++
vscode是微软的最新产品,轻量易用,最初是前端用的多,尤其是typescript,因为vscode的作者也是typescipt作者.一般c++的IDE很多,比如visual studio等,但是都 ...
- php7之严格模式RFC
首先需要开启严格模式: declare(strict_types = ); 严格模式下,形参和返回值可加限制.对返回值的限制需要在参数的()后面加上引号加类型限制即可,例: function demo ...
- Apache Hive处理数据示例
继上一篇文章介绍如何使用Pig处理HDFS上的数据,本文将介绍使用Apache Hive进行数据查询和处理. Apache Hive简介 首先Hive是一款数据仓库软件 使用HiveQL来结构化和查询 ...
- Arcmap连接数据库需管理员获取许可——创建ArcSDE连接文件
一.在装有server的服务器上创建ArcSDE连接文件 1.打开ArcMap<<ArcToolBox<<数据管理工具<<工作空间<<创建ArcSDE连 ...
- sql语言 含有包含关系的查询 (含mysql 和sql sever)
一.sql中查询包含关系的查询 sql语句中包含关系可以使用 in 和exist,但有些时候仅仅用这两个是不够的,还有表示方法是 not exist(b expect a )可以表示a包含b. 二. ...
- C语言中->是什么意思啊?比如说 p=p->next 到底表达了什么意思,请说清楚点,还有->这个符号是一个整体吗,什么意思??
->是一个整体,它是用于指向结构体.C++中的class等含有子数据的指针用来取子数据.换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中 ...
- 谈一谈Crsf和XSS攻击
crsf 和 XSS CRFS攻击全称是一种利用cookie的漏洞进行的一种跨域请求伪造: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一 ...