关于隐藏属性

引子:

当类的属性或者类实例对象的属性隐藏的时候必须通过存取器方法来获取和设置这些隐藏的属性。

例如:

def get_name(self,name):     #存取器方法

self._name=name

通过外部调用实例函数传参达到获取和设置隐藏属性的目的。这样的函数叫做存取器

缺点:是必须通过调用存取器方法来实现这些功能

为此python提供了更强大的特性函数,即property函数

(1)property()函数

例如:

name=property(get_name,set_name)

property函数封装了get_name,set_name存取器方法,在类的外部可以像其他没隐藏的属性一样操作属性

实际上,property是一个类,它的实例包含了一些魔法方法,上述例子name=property()就是它的一个实例对象,这个实例对象实现了隐藏属性的反隐藏

property还可以通过修饰器的形式实现这个功能

(2)@property装饰器

实现其他语言所拥有的getter,setter和deleter的功能(例如IOS苹果开发,实现获取,设置,删除隐藏的属性)

作用:

用来模拟一个属性

(其实‘模拟’这个说法不是很准确,官方这么说就这么用了,应该说重写更合适,因为模拟前后的属性是同一个属性,用id()函数获取的地址值是相同的)

通过@property装饰器可以对模拟属性的取值和赋值加以控制

例如:

__双下划线隐藏的属性可以被控制在外部修改

@property  (实现getter取值)

def score(self):

return self.__score 返回隐藏的属性

(score看似是一个实例函数,其实是一个属性,因为它已经被property装饰器装饰了)

@score.setter   (实现设置值,必须写成setter,因为python就是这么规定的)

def score(self,v):

assert 0<=v<=100,‘成绩不合法’

self.__score=v

@score.deleter

def.score(self):  (实现删除值)

del self.__socre

注意:

属性一旦删除,就无法设置和获取

为什么用properyt函数?

property通常用在类或者子类中对隐藏属性的改写,类的代码可能有几千行,隐藏属性在内部调用的次数可能就有几百次,如果一个个修改很麻烦,用存取器方法和property函数可以很方便的实现隐藏属性的反隐藏

另外python还有一种处理隐藏属性的方法,不过这个知识点比较晦涩难懂

(3)python的类内部有__getattr__,__setattr__,__delattr__魔法方法,能拦截所有的类属性

例如:

a.name

当在类的外部访问不到隐藏的属性时候,__getattr__会被自动调用,它搜索所的类属性,直到找到隐藏的属性

在类内__getattr__这些魔法方法是可以重写的(重写还是比较复杂的)

class A;

def __getattr__(self,name):    #这里的形参name是属性名的意思,不是类属性self.name的那个name

if name=‘name’:

return  self.__name

else:

raise  AttributeError()

这里要写一个判断,目的是为了当找不到属性时候(类里面根本就没有这个属性,无论是否是隐藏的属性),就直接报错,避免__getattr__一直不停地搜寻下去,形成死循环

在交互模式下用help(list.__getattribute__)查看__getattr__或者__getattribute__的工作原理如下:

__getattribute__(self, name, /)

    Return getattr(self, name)

它是返回python的内建函数getattr(),即不断地查询类内的所有属性

class A;

def __setattr__(self,name,value):

if name=‘name’:

self.__name=name

else:

self.__dict__[name]=value

这里设置判断,如果没有这个属性,就直接用__dict__[name]=name来给类实例增加一个属性,避免死循环

所以总结一下,用魔法方法__getattr__这类方法比用property属性方法相比更复杂点,建议处理同类问题的时候用property属性方法更好

python中关于类隐藏属性的三种处理方法的更多相关文章

  1. python 中增加css样式的三种方式

    增加css样式的三种方式: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. Python 中删除列表元素的三种方法

    列表基本上是 Python 中最常用的数据结构之一了,并且删除操作也是经常使用的. 那到底有哪些方法可以删除列表中的元素呢?这篇文章就来总结一下. 一共有三种方法,分别是 remove,pop 和 d ...

  3. DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)

    DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...

  4. C++中的类继承(1) 三种继承方式

    继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程. ...

  5. python中“*”、"*args"、"kwargs"三种用法

    参考链接:https://www.cnblogs.com/cwind/p/8996000.html 注意的是: (1)"*"符号的用法很类似C++中的指针,针对列表; (2)&qu ...

  6. python中简单文件的输入三种方式

    最近在自学python,简单的总结了一下文件的输入的方式. 1. f=open("foo.txt") line=f.readline() while line: print(lin ...

  7. python中自定义类对象json字符串化的方法

    1. 用 json 或者simplejson 就可以 2.定义转换函数: def convert_to_builtin_type(obj): print 'default(', repr(obj), ...

  8. Class类对象的三种实例化方法

    class X { } public class GetClassDemo01 {     public static void main(String[] args) {         X x = ...

  9. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

随机推荐

  1. Java匹马行天下——开篇

    个人感言: 匹马行天下是我高中时候看过一部叫<九鼎记>的小说中的其中一个大章节标题,在整个这一章中,讲的是是主人公滕青山历经艰险,又心如磐石,一心修行,最后巅峰归来的故事.现在回想,依旧心 ...

  2. MySQL:索引

    索引的目的在于提高查询效率,它的作用就相当于一本书的目录: 1. 常见的索引模型 1.1 哈希表 优点:适用于等值查询的场景: 缺点:范围查询效率较低: 1.2 有序数组 优点:范围查询和等值查询效率 ...

  3. 使用Ansible实现数据中心自动化运维管理

    长久以来,IT 运维在企业内部一直是个耗人耗力的事情.随着虚拟化的大量应用.私有云.容器的不断普及,数据中心内部的压力愈发增加.传统的自动化工具,往往是面向于数据中心特定的一类对象,例如操作系统.虚拟 ...

  4. python(32)——【shelve模块】【xml模块】

    一. shelve模块 json和pickle模块的序列化和反序列化处理,他们有一个不足是在python 3中不能多次dump和load,shelve模块则可以规避这个问题. shelve模块是一个简 ...

  5. SqlServer 循环建表、删除表、更新表

    常用于分库分表 1.批量删除 declare @outter int declare @inner int ) ) ) begin set @tablePrefix='BankPayOrder_'+c ...

  6. redis的安装使用以及在python中操作redis

    一.Redis介绍: Redis可以看作是一个key-value的存储系统,它为我们提供了丰富的数据结构,包括lists,sets,ordered sets和hashes.还包括了对这些数据结构的丰富 ...

  7. 关于 Spring Security 5 默认使用 Password Hash 算法

    账户密码存储的安全性是一个很老的话题,但还是会频频发生,一般的做法是 SHA256(userInputpwd+globalsalt+usersalt) 并设置密码时时要求长度与大小写组合,一般这样设计 ...

  8. mysql 开发进阶篇系列 25 数据库RPM安装目录介绍

    一.概述 mysql可以在多个平台上运行,在windows平台上安装有noinstall包和图形化包二种方式.在linux/unix平台上有RPM包安装,二进制包(Binary Package)安装, ...

  9. 以ActiveMQ为例JAVA消息中间件学习【1】

    前言 在慢慢的接触大型的javaweb的项目就会接触到很多的中间件系统. 其中消息中间件在很多场景下会被运用. 这里主要就对最近所学习到的消息中间件知识做一个笔记,为以后的实际运用打下一个良好的基础. ...

  10. winhex十六进制常用快捷键

    Winhex的常用快捷键 摘要: Winhex 是一个专门用来对付各种日常紧急情况的工具.它可以用来检查和修复各种文件.恢复删除文件.硬盘损坏造成的数据丢失等.同时它还可以让你看到其他程序隐藏起来的文 ...