一. 反射

'''
# isinstance
class A:pass
class B(A):pass
a = A()
print(isinstance(a,A)) # 判断对象和类的关系
print(issubclass(B,A)) # 判断子类和父类的关系
print(issubclass(A,B))
'''
#--------------------------------------------------------------------------------#
# # 反射:是用字符串类型的名字,去操作变量
# # hasattr
# # getattr
# # setattr
# # delattr
# name = 1
# eval('print(name)') # 安全隐患
#
# # 反射 就没有安全问题
#
# # 反射对象中的属性和方法
# class A:
# def func(self):
# print('in func')
# a = A()
# a.name = 'alex'
# a.age = 63
# # 反射对象的属性
# ret = getattr(a,'name') # 通过变量名的字符串形式取到的值
# print(ret)
#
# # 变量名 = input('>>>') # func
# # print(getattr(a,变量名))
# # print(a.__dict__[变量名])
#
# # 反射对象的方法
# getattr(a,'func')() #--------------------------------------------------------------------------------#
'''
反射类的属性 class A:
price = 20
def func(self):
print('in func')
# A.price
print(getattr(A,'price')) '''
#--------------------------------------------------------------------------------#
'''
# 反射类的方法:classmethod staticmethod class A:
price = 20
@classmethod
def func(cls):
print('in func')
# A.func()
if hasattr(A,'func'): # 如果能找到则执行下面的语句
getattr(A,'func')() ''' #--------------------------------------------------------------------------------# # 模块 # 反射模块的属性 # import monday
# # print(monday.day) # monday
# print(getattr(monday,'day')) # # 反射模块的方法
# getattr(monday,'wahaha')() # 内置模块也能用 #----------------------------------------------------------------------------------# '''
year = 2018
import sys
# print(sys.modules['__main__'].year) # 2018 # 反射自己模块中的变量 def qqxing():
print('qqxing')
print(getattr(sys.modules['__main__'], 'year')) # 反射自己模块中的函数 # getattr(sys.modules['__main__'], 'qqxing')()
变量名 = input(">>>")
print(getattr(sys.modules[__name__],变量名)) '''
# import time
# x = input('>>>')
# print(getattr(time,x)()) # 一个模块中的类能不能反射得到? 能
# import monday
# getattr(monday,'C')
#
# if hasattr(monday,'year'):
# getattr(monday,'year') '''
# setattr 设置一个变量
class A:
pass
a = A()
setattr(a,'name','nezha') # 给a设置一个name为nezha
setattr(A,'name','alex') # 给A添加一个name为alex
print(a.name)
print(A.name) # delattr 修改一个变量
delattr(a,'name') # 删除的是对象a的name
print(a.name) # 对象a中找不到name,去A类中找到了
delattr(A,'name')
print(a.name) # 报错
'''

二. 类的内置方法

# 内置的类方法,和内置的函数之间有着千丝万缕的联系

# 双下方法

# obj.__str__

# print(str(1))
#
# # obj.__repr__
# print(1,'1')
# print(repr(1))
# print(repr('1'))
#
# class A:
# pass
# a = A()
# print(str(a)) # 现在a 里面找str,没找到 就找父类object的str方法 # <__main__.A object at 0x000001F60CEF0E48>
# # object 里有一个 __str__ ,一旦被调用,就返回调用这个方法的对象的内存地址
#
# class B:
# def __str__(self):
# return "B's object"
# def func(self):
# return 'wahaha'
# b = B()
# print(b) # 打印一个对象的时候,就是调用 b.__str__
# print(str(b))
#
# # l = [1, 2, 3, 4, 5] # 实例化了一个列表类的对象
# # print(l)
#
# print('%s:%s'%('B',b)) # %s str() 直接打印 实际上都是走的__str__ # class Teacher:
# def __init__(self, name, salary):
# self.name = name
# self.salary = salary
# def __str__(self):
# return "Teacher's object:%s"%self.name
# def func(self):
# return "wahah"
# alex = Teacher('alex',250)
# print(alex) # __repr__
#
# class Teacher:
# def __init__(self, name, salary):
# self.name = name
# self.salary = salary
# def __repr__(self):
# return str(self.__dict__)
# def func(self):
# return "wahah"
#
# alex = Teacher('alex',250)
# # print(repr(alex)) # %r repr() 实际上都是走的 __repr__
# # print('>>>%r'%alex)
#
# print(str(alex)) # 没有打印内存地址
# print('>>>%s'%alex) # repr 是 str 的备胎...反过来不可以(也就是str 不是 repr 的备胎) # print()/%s/str(obj)的时候,实际上是内部调用了obj.__str__方法,如果有str方法,那么他返回的必定是一个 字符串(必须是字符串,不能是数字等.)
# 如果没有__str__方法,会先找本类中的__repr__方法,在没有,再找父类中的__str__方法,若父类没有,就找__repr__...一直找到object中的__str__ # repr() 只会找__repr__ ,如果没有,就找父类的 # 所以 若 repr 和str只能实现一个方法的话 ,应该实现repr方法,因为str也可以用repr # 内置的方法有很多,不一定都在object中
# class A:
# pass
# # def __len__(self):
# # return 10
# a = A()
# print(len(a)) # object of type 'A' has no len()
#-------------------------------------------------------------------------#
# class Classes:
# def __init__(self, name):
# self.name = name
# self.student = []
# def __len__(self):
# return len(self.student)
#
# py_s9 = Classes('python全栈9期')
# py_s9.student.append('二哥')
# py_s9.student.append('哥')
# py_s9.student.append('二')
# print(len(py_s9)) # ----------------------------------------------------------------------------------- # # __del__
#
# class A:
# def __del__(self): # 析构函数:在删除一个对象之前进行一些收尾工作
# self.f.close()
# a = A()
# a.f = open() # 打开文件 ,第一 在操作系统中打开了一个文件 拿到了文件操作符存在了内存中
# del a # a.f 拿到了文件操作符消失在了内存中
#
# import time
# time.sleep(3)
# # del a # del 先执行了这个方法,然后再删除这个变量
#
# # 引用计数
#
# print(a) # -------------------------------------------------------------------------------------------------------------------- # # __call__
class A:
def __init__(self, name):
self.name = name
def __call__(self):
'''
打印这个对象中的所有属性
:return:
'''
for k in self.__dict__:
print(k,self.__dict__[k])
# a = A('alex')()
#
# a = A('alex')
# a() # 一个对象 加上括号 相当于执行__call__方法

python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法的更多相关文章

  1. python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装

    一. 接口类 java:面向对象编程 设计模式 -- 接口类 接口类:python原生不支持 抽象类:python 原生支持的 from abc import abstractclassmethod, ...

  2. python学习之老男孩python全栈第九期_day010知识点总结

    def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...

  3. python学习之老男孩python全栈第九期_day016知识点总结

    '''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...

  4. python学习之老男孩python全栈第九期_day015知识点总结

    # 作用域相关(2)locals() # 返回本地作用域中的所有名字 globals() # 返回全局作用域中的所有名字 # 迭代器/生成器相关(3)range()print('__next__' i ...

  5. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  6. python学习之老男孩python全栈第九期_day020知识点总结——序列化模块、模块的导入和使用

    一. 序列化模块 # 序列化 --> 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化# 反序列化 --> 从字符串转换成数据类型的过程叫做反序列化# 序列 -- 字符串 # 什 ...

  7. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  8. python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

    一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...

  9. python学习之老男孩python全栈第九期_day007知识点总结

    基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...

随机推荐

  1. 总结day5 ---- ,字典的学习,增删改查,以及字典的嵌套, 赋值运算

    内容大纲: 一:字典的定义 二:字典的增加 >1:按照key增加,  无则增加,有则覆盖 >2:setdefault()  ,无则增加,有则不变 三:字典的删除 >1:pop()  ...

  2. 阿里巴巴前端面试分享-社招(p6)

    借鉴了朋友的阿里面试经:(社招前端2年经验) 电话面 简单自我介绍, 做过哪些项目, 使用哪些技术栈 ? 如何看待前端框架选型 ? vue的如何实现双向绑定的 ? react 虚拟DOM 是什么? 如 ...

  3. php解析word,获得文档中的图片

    背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...

  4. Visual Studio进行负载测试,RIG和负载测试术语- Part II

    对于一个多用户的应用程序,性能是非常重要的.性能不仅是执行的速度,它包括负载和并发方面.Visual Studio是可以用于性能测试的工具之一.Visual Studio Test版或Visual S ...

  5. 【算法笔记】A1063 Set Similarity

    1063 Set Similarity (25 分)   Given two sets of integers, the similarity of the sets is defined to be ...

  6. hdu 1233 还是畅通工程 并查集or最小生成树

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 ...

  7. 二、利用继承修改OPENERP 的一个模块

    问题记录1: No modules named 'xx' 原因: __init__.py 文件命名错误! 问题记录2: XMLSyntaxError: Attribute name redefined ...

  8. 当spring抛出异常时出现的页面的@ExceptionHandler(RuntimeException.class) 用法

    当spring抛出异常时出现的页面的@ExceptionHandler(RuntimeException.class) 用法 主要用在Controller层 @ExceptionHandler(Run ...

  9. 关于禁止html缓存

    在现代的浏览器里,为了增强用户体验,浏览器一般都会把网页上所需的静态文件缓存到本地,再次刷新的时候则无需再重新加载,但是我们有时候就是不需要浏览器缓存这些文件,而是每次都从服务器端读取数据,可以用以下 ...

  10. java1.8中ConcurrentHashMap

    java1.8中的ConcurrentHashMap做了非常大的改动,整个数据结构都发生了变化,已经不存在segment了.所以要好好重新查看下源码.这篇博客是逐步更行的,看一点写一点. 首先看一个很 ...