一、动态增加类的属性与方法

#类在定义时为空,后面做动态增加

class Student(object):

pass

s=Student()

#1 动态增加实例的属性

s.name = 'tian'

print(s.name)

#2 动态增加实例的方法,但是其他实例不能用

def set_agenow(self,age):

self.age=age

from types import MethodType

s.set_age=MethodType(set_agenow,s)

s.set_age(25)

print(s.age)

print(dir(s))

print(dir(Student))

#…… 'age', 'name', 'set_age'],说明确实加上去了

#3 动态增加类的方法,增加的方法中又增加了属性,

#这个会有些复杂……

# 结果:增加的方法所有实例都可以用

#但注意:增加的方法中增加的属性,是实例的属性,不是类的

def set_score_now(self,score):

self.score=score

Student.set_score=set_score_now

s1=Student()

s2=Student()

s1.set_score(80)#可以执行

s2.set_score(90)#可以执行

#但Student.set_score(90)会报错,虽然dir(Student)已经有个set_score方法,但是该方法是给实例调用的,参数有self和value两个,Student.set_score(90)参数不对

print(s1.score)#80

print(s2.score)#90

#print(Student.score)

#这一句会报错AttributeError: type object 'Student' has no attribute 'score',因#类根本没有这个属性

print(dir(s1))

print(dir(s2))

#'score', 'set_score'都有

print(dir(Student))#没有'score'属性,只有'set_score'方法,而且还不能对类用

#4 __slots__限制动态增加的属性

#注意 __slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

class Student(object):

__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

s=Student()

#s.score = 99会报错,因为限制了智能有'name', 'age'

#AttributeError: 'Student' object has no attribute 'score'

class GraduateStudent(Student):

pass

g = GraduateStudent()

g.score = 9999

#子类不受slot限制

#除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

二、类的装饰器@property

#Python内置的@property装饰器,把一个方法,变成可以像属性那样,做取值用

#@score.setter,把一个方法,变成可以像属性那样,作赋值用

#@property和score()同时,表示可读可写;只有@property,表示只读

#下面的score()本身是一个方法,本来的用法是s.score()

# 经过@property,可以像属性那样用s.score,不加括号

class Student(object):

@property

def score(self):

return self._score

@score.setter

def score(self, value):

if not isinstance(value, int):

raise ValueError('score must be an integer!')

if value < 0 or value > 100:

raise ValueError('score must between 0 ~ 100!')

self._score = value

s = Student()

s.score = 60 # OK,实际转化为s.set_score(60)

s.score # OK,实际转化为s.get_score()

#练习:请利用@property给一个Screen对象加上width和height属性,以及一个只读属性resolution

class Screen(object):

@property

def width(self):

return self._width

@width.setter

def width(self,value):

self._width=value

@property

def height(self):

return self._height

@height.setter

def height(self,value):

self._height=value

@property

def resolution(self):

self._resolution=self._width*self._height

return self._resolution

s = Screen()

s.width = 1024

s.height = 768

print('resolution =', s.resolution)

if s.resolution == 786432:

print('测试通过!')

else:

print('测试失败!')

@property python知乎_【python】__slots__与@property相关推荐

  1. 怎么学python知乎_你是怎么学习Python的 ?

    大家不要看到这个文章的题目,就认为这是一篇广告软文.然而并不是,因为我看到了很多同行都被大数据.人工智能的热潮吸引了,开始纷纷学习python.这是好事,但看到了好多人都走了不少弯路,浪费了时间.于是 ...

  2. go还是python 知乎_知乎用Go替代Python

    说不上哪个语言会比另一个语言更好.只能说某个语言在某个方面处理某些问题更具有优势吧. 大概每个开发人员应该都会认为自己使用的语言是世界最好的语言吧.这都相对来说的.对于每个人应该都是不同的. 众所周知 ...

  3. 怎么学python知乎_你们都是怎么学 Python 的?

    自学确实是比较难得,没有一个好的规划,好的学习路线图,你不会知道自己下一步该怎么办. 今天我就帮你来解决,分享2020年黑马程序员Python学习路线图,包含学习路线图,学习视频,学习工具,你都可以找 ...

  4. python 病毒 基因_#Python#提取基因对应的蛋白质名

    提取基因对应的蛋白质官方名 最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求. 搜索TP5 ...

  5. python keyboard模块_[python] PyMouse、PyKeyboard用python操作鼠标和键盘

    1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quartz, ...

  6. @property python知乎_知乎某处XSS+刷粉超详细漏洞技术分析

    我觉得十分经典的一个漏洞,和大家分享一下~ 好久没法前端漏洞分析了,这次来一个. 将输入的信息传入URI参数,解码以后赋值与location.href.明显可以利用JavaScript:伪协议执行js ...

  7. @property python知乎_使用Mxnet进行图像深度学习训练工具 InsightFace - 使用篇, 如何一键刷分LFW 99.80%, MegaFace 98%....

    开头先把论文和开源项目地址放一下: Additive Angular Margin Loss for Deep Face Recognition​arxiv.org deepinsight/insig ...

  8. 儿童 编程 python 知乎_知乎热议!学完Python之后,我的编程能力竟然退化了!

    来源:雪球App,作者: 雪_雪雪_球,(https://xueqiu.com/7788828530/135705417) 在知乎上有一个特别火的问题:如何学Python? 你会看到很多高赞回答是: ...

  9. python 主线程 等待 子线程 知乎_[Python] 知乎多线程爬虫

    知乎多线程爬取问题: 自打放了寒假,我就一直想把系统的学习一遍Python爬虫的知识.因为以前只是零碎的学习,造成许多东西都只是一知半解. 项目灵感来源是觉得单曲循环的歌至少让一个人曾经在聆听中感动过 ...

  10. python内存技巧_使用__slots__节省python内存技巧

    __slots__作用 __slots__有一个作用是:限制类实例绑定的属性,但是它有一个更重要的作用就是节省内存,当然更适用于数据量大的情况(万量级以上). __slots__节省内存的原理 cla ...

最新文章

  1. Python标准库asyncio模块基本原理浅析
  2. 郑州升达学院计算机考试,第35次全国计算机等级考试报名工作通知
  3. T-SQL查询高级—SQL Server索引中的碎片和填充因子
  4. ALEX net 解读
  5. React 源码剖析系列 - 解密 setState
  6. 九宫格抽奖V1.3.26正版
  7. Jquery的知识图谱
  8. 输入学号姓名输出学号姓名c语言,急啊!!!求救了 C语言编一个链表,输出姓名和学号就好...
  9. 网页中加载flash的方法
  10. Http Post 二进制通信
  11. 黑马程序员——Java高新技术枚举和自动装箱
  12. 国内计算机期刊SCI收录
  13. 如何判断等保测评机构有资质?符合要求?
  14. 那些年微信开发过的鸡肋功能,及其带给我们的思考
  15. 服装ERP应用(12)-某公司的服装(鞋业)ERP解决方案
  16. 摄像头ip分享论坛_谁的SIP软交换呼叫中心终端摄像头正在公网裸奔
  17. 软件开发人员绩效评价标准
  18. Linux上传输大于4G的文件,sz命令用不了
  19. 黑暗逃生怎么修改服务器,《黑暗逃生》常见问题解决方法 游戏进不去怎么办...
  20. 全国青少年软件编程等级考试C语言标准解读(1_10级)

热门文章

  1. 各个国家的市场分析(俄罗斯,白俄罗斯)
  2. CRAFT: Character Region Awareness for Text Detection ---- 论文翻译
  3. 蒂姆•库克在斯坦福毕业典礼上都讲了啥?
  4. 吐血整理C++书单,萌新到大牛,要看哪些书?
  5. 全球诺贝尔奖得主最多的30所大学排名
  6. 这是最好的企业管理手册
  7. 生活账本怎么记不会乱,用哪一记账工具才能让账目更清晰
  8. Docker Windows Containers
  9. U盘被写保护?我来教你高级格式化
  10. CPU卡指令文件读取算法