python's twenty-third day for me 面向对象进阶
普通方法:对象和类绑定的过程。
class A:
def func1(self):pass
def func2(self):pass
def func3(self):pass
def func4(self):pass a = A()
b = A()
print(A.func1) # <function A.func1 at 0x00000217A0BE3400>
print(a.func1) # <bound method A.func1 of <__main__.A object at 0x00000217A0CF9EB8>>
print(b.func1) # <bound method A.func1 of <__main__.A object at 0x00000217A0CFF080>>

类方法:由于不适用对象内存空间的属性所以不会将对象和方法绑在一起。而是将类和方法绑在一起。
class A:
def func1(self):pass
@classmethod
def func2(cls):pass
def func3(self):pass
def func4(self):pass a = A()
b = A()
print(A.func2) # <bound method A.func2 of <class '__main__.A'>>
print(a.func2) # <bound method A.func2 of <class '__main__.A'>>
print(b.func2) # <bound method A.func2 of <class '__main__.A'>> # 对象能找到类,类里面绑着方法。
静态方法:不是绑定方法,没有和对象或者类发生任何绑定关系。
class A:
def func1(self):pass
@classmethod
def func2(cls):pass
def func3(self):pass
@staticmethod
def func4(self):pass a = A()
b = A()
print(A.func4) # <function A.func4 at 0x000002BE409837B8>
print(a.func4) # <function A.func4 at 0x000002BE409837B8>
print(b.func4) # <function A.func4 at 0x000002BE409837B8> # 没有绑定 : 并没有 bound method
isinstance:能够检测到继承关系。判断一个对象和一个类有没有血缘关系。isinstance(对象名,类名)。
# 能够检测到继承的关系。
class A:pass
class B(A):pass
class C(B):pass
c = C()
print(isinstance(c,C)) # True
print(isinstance(c,B)) # True
print(isinstance(c,A)) # True # type 只是单纯的判断类
print(type(c) is C) # True
print(type(c) is B) # False
print(type(c) is A) # False
issubclass:可以查看是否存在继承关系。
# issubclasss(子类名,父类名) 返回bool值。
class A:pass
class B(A):pass
class C(B):pass
print(issubclass(B,A)) # True
print(issubclass(C,B)) # True
print(issubclass(C,A)) # True
反射:
反射的4个内置函数:1,getattr 2,hasattr 3,setattr 4,delattr
正常情况下,如果可以拿到这个变量,那么如有这个变量的字符串形式,就是用反射可以获取到这个值。
概念:使用字符串数据类型的变量名,访问一个命名空间中的名字。
找一个属性,直接就可以找到这个属性的值。
找一个方法,找到的是这个方法的的内存地址。
class A:
role = 'Person'
def func(self):
print('*')
# ret = input('>>>')
# a = A()
print(getattr(A,'role')) # 从A的命名空间里找一个属性,直接就可以找到这个属性的值
f = getattr(A,'func');f(1) # 从A的命名空间找一个方法,找到的是这个方法的内存地址
hasattr() 判断一个命名空间中有没有这个名字。
getattr() 从命名空间中获取这个名字对应的值,如果空间里没有这个属性则会报错。
class A:
role = 'Person'
def func(self):
print('guxiaobai')
ret = input('>>>')
if hasattr(A,ret):
f = getattr(A,ret)
print(f)
if type(f) is not str:
f(1) # 若是函数名则以加括号执行。
# 其次因为是从类中寻找的所以需要传参数。若是对象中找,则不需要传参数。
class A:
role = 'Person'
def func(self):
print('guxiaobai')
ret = input('>>>')
a = A()
if hasattr(a,ret):
f = getattr(a,ret)
print(f)
if type(f) is not str:
f()
类中的反射:类可以获取类中的属性和方法。
class A:
role = 'Person'
def func(self):
print('guxiaobai') print(hasattr(A,'role')) # True
print(hasattr(A,'func')) # True
ret = input('>>>')
if hasattr(A,ret):
print(getattr(A,ret))
class A:
role = 'Person'
def __init__(self):
self.money = 100
def func(self):
print('guxiaobai')
a = A()
print(hasattr(a,'money')) # True
print(getattr(a,'money')) # 100
getattr(a,'func')() # guxiaobai
模块使用模块中的名字:
import time # 一个py文件就是一个模块
time.time()
print(getattr(time,'time')())
在自己所在的模块中使用自己的名字:
1,import sys 首先导入sys模块。
2,getattr(sys.modules['__main__'],名字)
def login():
print('执行login功能')
def register():
print('执行register功能') import sys
while True:
ret = input('请输入你想执行的功能:退出输入Q/q:')
if ret.upper() == 'Q':
break
if hasattr(sys.modules['__main__'],ret):
getattr(sys.modules['__main__'],ret)()
getattr 一定要和 hasattr 配合使用。
setattr:修改和新建。
class A:
def __init__(self,name):
self.name = name def func(self):
print('guqingqiu') a = A('顾清秋')
print(a.name) # 顾清秋
setattr(a,'name','顾小白') # 已经存在的属性是修改。
print(a.name) # 顾小白
print(a.__dict__) # {'name': '顾小白'}
setattr(a,'age',17)
print(a.__dict__) # {'age': 17, 'name': '顾小白'}
print(a.age) # 17 # 不存在的属性就是新建。
setattr 如果新建方法(只能将不属于类的方法移入到类中)且格式:setattr(类名,‘方法名’,方法名)因为方法一般不存放在对象中,所以一般是类名,若是用对象调用,则 方法(形参)中必须有一个形参,否则就不需要。
def login():
print('执行login功能')
class A:
def __init__(self,name):
self.name = name def func(self):
print('guqingqiu')
a = A('顾清秋')
print(A.__dict__)
setattr(A,'login',login)
print(A.__dict__)
getattr(A,'login')() # 外部login()中不需要形参。
getattr(a,'login')() # 外部login(self)中需要形参,否则会报错。
delattr:删除属性或方法,基本不用。
class A:
def __init__(self,name):
self.name = name
def func(self):
print('guqingqiu')
a = A('顾清秋')
print(a.__dict__) # {'name': '顾清秋'}
delattr(a,'name')
print(a.__dict__) # {}
内置方法:
内置的东西都和内置方法有着千丝万缕的联系。
class A:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __len__(self):
return len(self.__dict__)
a = A('alex',35,'不详')
print(a.__len__()) #
a.hobby = '开车'
print(a.__len__()) #
字典的存储:hash
# hash 和 __hash__关系
class A:
def __init__(self,name,age):
self.name = name
self.age = age
def __hash__(self):
return 0 # return 是什么就是什么值。
a = A('alex',35)
print(hash(a))
print(a.__hash__())
python's twenty-third day for me 面向对象进阶的更多相关文章
- Python自动化运维之12、面向对象进阶
上一篇<面向对象基础>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公 ...
- Python之路【第九篇】:面向对象进阶
阅读目录 一. isinstance(obj,cls)和issubclass(sub,super)二. 反射三. __setattr__,__delattr__,__getattr__四. 二次加工标 ...
- Python之路(第二十九篇) 面向对象进阶:内置方法补充、异常处理
一.__new__方法 __init__()是初始化方法,__new__()方法是构造方法,创建一个新的对象 实例化对象的时候,调用__init__()初始化之前,先调用了__new__()方法 __ ...
- Python之路(第二十八篇) 面向对象进阶:类的装饰器、元类
一.类的装饰器 类作为一个对象,也可以被装饰. 例子 def wrap(obj): print("装饰器-----") obj.x = 1 obj.y = 3 obj.z = 5 ...
- Python之路(第二十六篇) 面向对象进阶:内置方法
一.__getattribute__ object.__getattribute__(self, name) 无条件被调用,通过实例访问属性.如果class中定义了__getattr__(),则__g ...
- Python全栈开发【面向对象进阶】
Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...
- 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- 进击的Python【第六章】:Python的高级应用(三)面向对象编程
Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语: ...
- Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)
Python开发[第七篇]:面向对象 详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)> ...
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
随机推荐
- Python主流框架
15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python Web应用开发框架Django 应该是最出名的Pyth ...
- ZOJ 3498 Javabeans(找规律)
Javabeans Time Limit: 2 Seconds Memory Limit: 65536 KB Javabeans are delicious. Javaman likes t ...
- Git和SVN之间的区别
如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...
- Leetcode 1013. Partition Array Into Three Parts With Equal Sum
简单题,暴力找出来就行. class Solution: def canThreePartsEqualSum(self, A: List[int]) -> bool: s = sum(A) if ...
- 几个Unity3d UI制作的解决方案.
1.ex2D的渲染机制 (高效的原因) 在以往的2D插件中,渲染方式是每个sprite单独渲染,由Unity负责Dynamic Batching.在新版ex2D中,我们经过严谨的优化实现了独立的dyn ...
- 剑指Offer面试题:7.斐波那契数列
一 题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二 效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 剑指offer-第六章面试中的各项能力(二叉树的深度)
题目:1:输入一个二叉树,求二叉树的深度.从根节点开始最长的路径. 思路:我们可以考虑用递归,求最长的路径实际上就是求根节点的左右子树中较长的一个然后再加上1. 题目2:输入一颗二叉树的根节点,判断该 ...
- 【知识笔记】前端样式CSS
一.页脚如何始终固定在页面底部显示 想要达到页脚固定在页面底部显示,也就是当页面主体高度在浏览器高度范围内时页脚靠浏览器底部,超出浏览器高度时页脚在页面主体下方,相当于在高度上的自适应. 乍看似乎很简 ...
- 洛谷 P2920 [USACO08NOV]时间管理Time Management
传送门 题目大意: 每个工作有截至时间和耗费时间,n个工作求最小开始时间. 题解: 贪心 从n-1安排,让结束时间尽量的晚. 注意:优先级 cout<<st<0?-1:st; (X ...
- Webpack-dashboard 简单使用
1. 安装 npm install webpack-dashboard --save-dev 2. 配置说明 webpack config // Import the plugin: var Dash ...