[py]python面向对象的str getattr特殊方法
本文旨在说清楚 类中的
- 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特殊方法的更多相关文章
- Python面向对象之常用的特殊方法(5)
Python面向对象里面有很多特殊方法,例如__init__(构造方法),__del__(析构方法),这些方法对于面向对象编程非常重要,下面列出一些常用的特殊方法 (1)__call__ class ...
- Python面向对象之反射,双下方法
一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
- python 面向对象之多态与绑定方法
多态与多态性 一,多态 1,多态指的是一类事物有多种形态(python里面原生多态) 1.1动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.AB ...
- Python面向对象之私有属性和方法
私有属性与私有方法 应用场景 在实际开发中,对象的某些属性或者方法 可能只希望在对象的内部被使用,而不希望在外部被访问到: 私有属性 就是对象不希望公开的属性: 私有方法 就是对象不希望公开的方法: ...
- python面向对象--类的内置方法
#isinstance(obj,cls)判断obj是否是类cls的实例 #issubclass(cls,cls1)判断cls是否是cls1的子类或派生类 class Foo: pass class B ...
- python面向对象 : 反射和内置方法
一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类 (注:type(对象名) is 类名 : 判断对象所属 ...
- Python 面向对象(四) 反射及其魔术方法
反射 reflection 也有人称之为自省 作用: 运行时获取.添加对象的类型定义信息,包括类 内建方法: getattr(object, name[, default]) 返回object对象 ...
- python 面向对象反射以及内置方法
一.反射 什么是反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用放射. 反射的四种方法: hasattr:hasattr(objec ...
- Python面向对象编程及内置方法
在程序开发中,要设计一个类,通常需要满足以下三个要求: [1]类名 这类事物的名字,满足大驼峰命名法 [2]属性 这类事物具有什么样的特征 [3]方法 这类事物具有什么样的行为 定义简单的类: 定义只 ...
随机推荐
- 【转载】.NET中锁6大处理方法 悲观乐观自己掌握
我们为什么需要锁? 在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这就会产生冲突,这个就是著名的并发性问题. 图 1 并行性问题漫画 如何解决并发性问题? 借助正确的锁定策略可以解决并发性 ...
- Androidの解决自动旋转导致activity重启问题
记录一下,经常在新建项目的时候就会发生这个问题,正好上次有个群友也问道了这个问题.就是设备屏幕打开自动旋转会导致activity重启,这样会消耗很多资源. 比如在加载listview数据会重新请求数据 ...
- Geoserver
Geoserver是一个功能齐全,遵循OGC开放标准的开源WFS-T和WMS服务器.利用Geoserver可以把数据作为maps/images来发布(利用WMS来实现)也可以直接发布实际的数据(利用W ...
- Qt编写气体安全管理系统(界面超漂亮)
自从把Qt样式表葵花宝典这个pdf文件看完以后,将所有的qss内容都轮了一遍,还写了个皮肤生成器工具,https://blog.csdn.net/feiyangqingyun/article/deta ...
- Android 自动化测试 robotium
转:http://xiaomaozi.blog.51cto.com/925779/908886 Android 的开发可以说已经遍地都是,不说精致的app,只要看些书,看点教学视频,学习二至三个月,都 ...
- win7 查看当前java路径
C:\Users\zh>where javaC:\Windows\System32\java.exeD:\TOOL\jdk1.8.0_91\bin\java.exeD:\TOOL\jdk1.8. ...
- ESlint全局变量报错
场景: 在main.js下申明了全局变量: /* eslint no-undef: "error" */ window.vm = new Vue({ el: '#app', rou ...
- 小米2s线刷出现remote: partition table doesn't exist
=================问题============ 小米2s线刷出现remote: partition table doesn't exist =================解决方案= ...
- How arduino IDE works?
test.ino void setup() { pinMode(,OUTPUT); } void loop() { digitalWrite(,HIGH); delay(); digitalWrite ...
- java.lang.instrument 中的premain 实现类的个性化加载(附源代码)
背景 想调用ASM API (用于字节码处理的开源API)对字节码进行处理,目标是实现对java程序运行时各种对象的动态跟踪,并进一步分析各个对象之间的关系(研究前提是目前的UML锁阐释的whole- ...