作为面对对象的核心内容,将从以下一个方面进行总结:
  1. property和@property
  2. __getattribute__()、__getattr__()、__setattr__()、__delattr__()
  3. 描述符__get__()、__set__()、__delete__()
  4. 不可变对象的实现

1. property和@property

  还是直接上代码来的方便

  property()用法

#coding = utf-8

class property_test:
def __init__(self, size=10):
self.size=size def __getsize__(self):
return self.size def __setsize__(self, value):
self.size = value def __deletesize__(self): del self.size x= property(__getsize__, __setsize__, __deletesize__) if __name__ == "__main__":
p = property_test()
p.x = 20
print (p.size) >>> 20

  @property用法

#coding = utf-8

'''class property_test:
def __init__(self, size=10):
self.size=size def __getsize__(self):
return self.size def __setsize__(self, value):
self.size = value def __deletesize__(self): del self.size x= property(__getsize__, __setsize__, __deletesize__) ''' class property_test:
def __init__(self, size=10):
self.sizevalue=size #特别注意sizevalue不要和size同名 @property
def size(self):
return self.sizevalue @size.setter
def size(self, value):
self.sizevalue = value @size.deleter
def size(self):
del self.sizevalue if __name__ == "__main__":
p = property_test()
p.size = 20
p.size += 20
print (p.size, p.sizevalue)

2. __getattribute__()、__getattr__()、__setattr__()、__delattr__()

  属性查找过程:

  __getattribute__  >>>> __dict__  >>>> __slots__ >>>> __getattr__

  主要注意__getattr__的用法和无限递归错误

  __getattr__在实例以及对应的__dict__中查找属性失败,那么会调用__getattr__函数

  防止无限递归错误可以使用以下两种方法:

   1. self.__dict__[name] = value
        2. super().__setattr__(name,value)

  例:

class rectange:
def __init__(self, width=20, height=40):
self.width = width
self.height = height def __getattr__(self, name):
return self.width def __setattr__(self,name, value):
if name == "squ":
super().__setattr__(name,value)
super().__setattr__("width",40)
super().__setattr__("height",40)
print (name, self.__dict__[name])
else:
#self.__dict__[name] = value
super().__setattr__(name,value)
print (name, self.__dict__[name]) if __name__ == "__main__":
p = rectange()
p.width = 10
p.squ = 80
print (p.width, p.height)

3. 描述符

  描述符说的直白点就是一个“绑定行为”的对象属性,通过__get__()、__set__()和__delete__()函数重写描述符属性

  如果上述方法被定义在一个对象中,那么这个对象就是一个描述符

  当定义拥有者类时,每个修饰符对象都是修饰符类的实例,绑定在类级别的属性上

  方法的原型为:

  ① __get__(self, instance, owner)

  ② __set__(self, instance, value)

  ③ __del__(self, instance)

class A:
def __init(self):
self.color = "red" def __get__(self, instance, owner):
print ("get instance:", instance)
print ("get owner:", owner)
return self.color def __set__(self, instance, value): print ("set instance:", instance)
print ("set value:", value)
self.color = value def __delete__(self, instance): print ("delete instance:", instance)
del self.color class B:
a = A()
def __init__(self):
self.color = "black" if __name__ == "__main__":
b = B()
b.a = "blue"
b.color = b.a
del b.a

4. 使用__slots__实现不可变对象

  首先说明下__slots__方法,具体可以查看https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200605560b1bd3c660bf494282ede59fee17e781000

  方法:

  1. 把__slots__设为唯一允许操作的属性,这会使得对象内部的__dict__不再有效并阻止对其他属性的访问

  2. 在__init__中调用基类的__setattr__实现

  3. 在__setattr__中抛出异常

  例:

#coding=utf-8

class student:
__slots__ = ("name") def __init__(self, name):
super().__setattr__("name", name)
self.name = name
print (self.name) def __str__(self):
return "{0.name}".format(self) def __setattr__(self, name, value):
raise Exception(" '{__class__.__name__}' has no\
attribute '{name}'".format(__class__=self.__class__,name=self.name)) if __name__ == "__main__":
s = student("zhanglin")
#s.name = "lizhi"

__slot__定义类中可以被外界访问的属性,类似node中的exports。

当父类中定义了__slot__时,不能向父类中添加属性。如果子类中没有定义__slot__,则子类不受父类__slot__定义的限制。

如果父类与子类中都定义了__slot__,则影响的结果为父类与子类__slot__的合集。

Python之属性、特性和修饰符的更多相关文章

  1. Java 类、属性、方法修饰符 public、private、protected、default

    Java 中修饰类修饰符:public .default (默认) Java 中修饰类中属性.方法修饰符:public.private.protected.default (默认) 通过 IDEA 创 ...

  2. python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】

    python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...

  3. Python学习 :面向对象 -- 成员修饰符

    成员修饰符 两种成员 - 公有成员 - 私有成员, __字段名 - 无法直接访问,只能通过内部方法来间接访问私有成员 简例:公有成员与私有成员  class Info: country = '中国' ...

  4. Vue基础知识之常用属性和事件修饰符(二)

    Vue中的常用选项 1.计算属性 computed为可以计算的属性,由get方法和set方法组成,默认调用的是get方法.里面的 计算属性简单来说,就是根据数据推算出来的值,当给这个值赋值时可以影响其 ...

  5. Delphi编译器属性(特别修饰符Ref,Unsafe,Volatile,Weak)

    1 Refdelphi中常量参数就像一个本地常量,或者说只读变量.常量参数与值参数类似,除了不能在过程或函数体内给常量参数赋值,并且不能将常量参数传给另一个var类型参数.(但是,如果你常量参数传递的 ...

  6. Java中各种(类、方法、属性)访问修饰符与修饰符的说明

    类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...

  7. Java 语言的类、属性、方法各有哪些修饰符?简述各修饰符的区别

    1. 类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1.公共类修饰符 pub ...

  8. python中的 @ 修饰符

    今天学习廖老师的python教程,碰到了修饰符'@',不太了解,查看了下官方文档. 简单的整理下: @dec2 @dec1 def func(arg1, arg2, ...): pass 等价于 de ...

  9. 解析Visual C# 7.2中的private protected访问修饰符

    去年12月份,随着Visual Studio 2017 Update 15.5的发布,Visual C#迎来了它的最新版本:7.2. 在这个版本中,有个让人难以理解的新特性,就是private pro ...

随机推荐

  1. sql 转

  2. win7 64位下使用regsvr32注册activex dll .

    由于公司产品用了很多activex dll,而我的操作系统是64位的win7,在注册这些dll时碰到了很多问题,经过摸索,最后还是成功注册了,步骤如下: 1.在C:\Windows\SysWOW64\ ...

  3. Django学习笔记之Django模版系统

    官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板语言中有特 ...

  4. Python3.x:pdf2htmlEX(解析pdf)安装和使用

    Python3.x:pdf2htmlEX(解析pdf)安装和使用 简介 pdf2htmlEX是一款优秀的pdf转换成html的工具: 下载 windows下载地址:http://soft.rubypd ...

  5. qt项目: error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1900”不匹配值“1800”

    error LNK2038: 检测到“_MSC_VER”的不匹配项:  值“1900”不匹配值“1800” 该错误 网上通常的解释是: 原因:由于你使用了vs2012,相比较vs2010以及之前的vs ...

  6. 20145229吴姗珊逆向BOF实践

    20145229吴姗珊逆向BOF实践 实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  7. 2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告

    北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构  班级: 1623  姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5 ...

  8. Could not find com.android.support:appcompat-v7:23.1.1

    在刚接触Android Studio的时候,这玩意整起来确实费劲,现在接触多了,感觉还好,毕竟还有一段提升的空间,以后的必然趋势,所以还是潜心下来好好搞搞. 废话少说,切入正题. 如图所示的error ...

  9. Sharding-Jdbc实现分表分库

    Sharding-Jdbc分表分库LogicTable数据分片的逻辑表,对于水平拆分的数据库(表),同一类表的总称.订单信息表拆分为2张表,分别是t_order_0.t_order_1,他们的逻辑表名 ...

  10. 《大型网站系统与JAVA中间件实践》读书笔记-数据访问层

    数据访问层 5.1.2数据库垂直/水平拆分的困难 随着网站业务的快速发展,数据量和访问量不断上升,数据库的压力越来越大. 更换更好的硬件(Scale Up)是一种解决方案,而且在我们能付得起硬件费用并 ...