本文旨在说清楚 类中的

  • def init
  • def str
  • def getattr

这三个方法怎么用的.

定制输入实例名时输出内容

def __str__会定制输出实例名时候的输出

class Chain(object):
def __str__(self):
return "hello" c = Chain()
print(c) #本来是<__main__.Chain object at 0x00000000021BE5C0> # hello

通过def __str__输出属性名

class Chain(object):
def __init__(self):
self.name = "maotai" def __str__(self):
return self.name c = Chain()
print(c) # maotai

__getattr__打印任意属性,如c.xx,c.yy

主要目的是实现动态添加属性

class Chain(object):
# 打印c.xx属性
def __getattr__(self, item):
return item c = Chain()
print(c.xx) #xxx
class Chain(object):
def __init__(self):
self.name = "maotai" # 打印c.xx属性时候返回定制内容
def __getattr__(self, item):
return item, self.name c = Chain()
print(c.xx) # ('xx', 'maotai')

剖析打印结果

class Chain(object):
def __init__(self, path=""):
self.__path = path def __str__(self):
return self.__path ## 打印Chain()的内容 def __getattr__(self, item):
# Chain("%s/%s" % (self.__path, item))即 __str__的结果
return Chain("%s/%s" % (self.__path, item)) ## 打印c.xx时, 返回Chain()的内容 c = Chain() #c.xx 的结果 Chain("/xx")
print(c.xx)

这个不好想清楚的在于, 往复的调用类执行过程

  • 函数返回值
  • 递归调用

class Chain(object):
def __init__(self, path=""):
self.__path = path
print(self.__path, "++++") def __str__(self):
# print(self.__path,"--------")
return self.__path ## 打印Chain()的内容 def __getattr__(self, item):
# Chain("%s/%s" % (self.__path, item))获取到的是 self.__path内容,供__getattr__返回.
# self.__path的内容是 ("%s/%s" % (self.__path, item))
# 第1次 self.__path="/xx", 供__getattr__返回.
# 第2次 self.__path="/xx/yy",供__getattr__返回.
# 第3次 self.__path="/xx/zz",供__getattr__返回. # return Chain()
# return Chain("/xx")
# return Chain("/xx/yy")
# return Chain("/xx/yy/zz")
return Chain("%s" % (item)) ## 打印c.xx时, 返回Chain()的内容 c = Chain() #c.xx 的结果 Chain("/xx")
#c.xx.yy 的结果 Chain("/xx/yy")
#c.xx.yy.zz 的结果 Chain("/xx/yy/zz")
print(c.xx.yy.zz) # /xx/yy/zz

[py]python面向对象的str getattr特殊方法的更多相关文章

  1. Python面向对象之常用的特殊方法(5)

    Python面向对象里面有很多特殊方法,例如__init__(构造方法),__del__(析构方法),这些方法对于面向对象编程非常重要,下面列出一些常用的特殊方法 (1)__call__ class ...

  2. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  3. python 面向对象之多态与绑定方法

    多态与多态性 一,多态 1,多态指的是一类事物有多种形态(python里面原生多态) 1.1动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.AB ...

  4. Python面向对象之私有属性和方法

    私有属性与私有方法 应用场景 在实际开发中,对象的某些属性或者方法 可能只希望在对象的内部被使用,而不希望在外部被访问到: 私有属性 就是对象不希望公开的属性: 私有方法 就是对象不希望公开的方法: ...

  5. python面向对象--类的内置方法

    #isinstance(obj,cls)判断obj是否是类cls的实例 #issubclass(cls,cls1)判断cls是否是cls1的子类或派生类 class Foo: pass class B ...

  6. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

  7. Python 面向对象(四) 反射及其魔术方法

    反射 reflection 也有人称之为自省 作用: 运行时获取.添加对象的类型定义信息,包括类 内建方法: getattr(object, name[, default])   返回object对象 ...

  8. python 面向对象反射以及内置方法

    一.反射 什么是反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用放射. 反射的四种方法: hasattr:hasattr(objec ...

  9. Python面向对象编程及内置方法

    在程序开发中,要设计一个类,通常需要满足以下三个要求: [1]类名 这类事物的名字,满足大驼峰命名法 [2]属性 这类事物具有什么样的特征 [3]方法 这类事物具有什么样的行为 定义简单的类: 定义只 ...

随机推荐

  1. PHP关于按位取反结果的推导过程

    哎呀几年过去,都快把大学学的计算机导论的知识给忘完了,现在来回顾一下按位去反的流程: <?php /** 首先来补充一下基础知识: php中有4个位运算,分别是&与 |或 ^异或 ~取反 ...

  2. R语言(入门小练习篇)

    问题: 一组学生参加了数学.科学和英语考试.为了给所有的学生确定一个单一的成绩衡量指标,需要将这些科目的成绩组合起来.另外,还想将前20%的学生评定为A,接下来20%的学生评定为B,以此类推.最后,希 ...

  3. css笔记 - transform学习笔记(二)

    transform转换 CSS transform 属于2D/3D上的转换.变形效果.他不是一个动画,他就是变形.比如正方形变平行四边形,再变圆形.都是形状变成另一个形状. 但是如果配合上transi ...

  4. SharePoint 2013部署自定义HttpModule访问SPContext.Current的一个问题

    如果文档库post提交文档时,自定义HttpModule正好有代码访问SPContext.Current属性则会导致上传文档失败.

  5. C# List<T> 泛型

    1.简介 所属命名空间:System.Collections.Generic List<T>类是 ArrayList 类的泛型等效类.该类使用大小可按需动态增加的数组实现 IList< ...

  6. 51单片机之IIC通信原理及软件仿真

    关于IIC我觉这个博客里面说的已经够清楚了 如下图所示的写操作的时序图: 其实像这种通信协议的要求是很精确的,一点点不对都可能导致在实际工程中无法读取数据.我就是被一个应答位耽误了好久,还好最后被我发 ...

  7. Vim 使用入门快捷键

    Vim 和 Emac 都是利器啊,前段时间决定熟悉一套跨平台的编辑器,以便在 Win,Mac,Ubuntu 下都有相同的编辑体验. 于是尝试了一下 Vim,使用了一段时间,确实比 UE 之类的要高效. ...

  8. Java -- 给定一个int数组,拼接出最大数值

    public class ZhiJieTiaoDong { /* 给定一个数组:组合成最大数值 */ public String szpj(int[] args){ if(null == args | ...

  9. opencv学习笔记之cvSobel 函数解析

    首先,我们来开一下计算机是如何检测边缘的.以灰度图像为例,它的理论基础是这样的,如果出现一个边缘,那么图像的灰度就会有一定的变化,为了方便假设由黑渐变为白代表一个边界,那么对其灰度分析,在边缘的灰度函 ...

  10. 老师的blog整理

    python基础部分: 宝哥blog: https://www.cnblogs.com/guobaoyuan/ 开哥blog: https://home.cnblogs.com/u/Neeo 女神笔记 ...