python 中一切皆对象,类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构建类)实例化得来的.
obj = A()print(type('abc'))print(type([1,2,3]))print(type((22,33)))# type 获取对象从属于的类print(type(A))print(type(str))print(type(dict))type 与 object 的关系. object类是type类的一个实例
print(type(object))object类是type类的父类.
print(issubclass(type,object))反射
程序对自己内部代码的一种自省方式.
反射是什么? 通过字符串去 *** 作对象的方式.
实例对象# class A:## country = '中国'## def __init__(self,name,age):# self.name = name# self.age = age## def func(self):# print('in A func')# obj = A('赵海狗',47)# hasattr# print(hasattr(obj,'name'))# print(hasattr(obj,'country'))# print(hasattr(obj,'func'))# print(getattr(obj,'name'))# print(getattr(obj,'func'))# f = getattr(obj,'func')# f()# print(getattr(obj,'sex',None))# if hasattr(obj,'name'):# getattr(obj,'name')# setattr,delattr 用的很少# obj.sex = '公'# print(obj.sex)# setattr(obj,'公')# print(obj.__dict__)# delattr(obj,'name')# print(obj.__dict__)类的角度
# class A:## country = '中国'## def __init__(self,age):# self.name = name# self.age = age## def func(self):# print(self)# print('in A func')## # if hasattr(A,'country'):# # print(getattr(A,'country'))### if hasattr(A,'func'):# obj = A('赵海狗',26)# getattr(obj,'func')()# getattr(A,'func')(obj)本模块
# 从当前模块研究反射:# a = 666## def func1():# print('in 本模块这个对象')# def func1():# print('in func1')## def func2():# print('in func2')## def func3():# print('in func3')## def func4():# print('in func4')# # func1()# # func2()# # func3()# # l1 = [func1,func2,func3,func4,]# import sys# # # print(sys.modules[__name__])# # print(getattr(sys.modules[__name__],'a'))# # getattr(sys.modules[__name__],'func1')()# # getattr(sys.modules[__name__],'func2')()# # getattr(sys.modules[__name__],'func3')()## func_lst = [f'func{i}' for i in range(1,5)]# # print(func_lst)# for func in func_lst:# getattr(sys.modules[__name__],func)()# class User:# def login(self):# print('欢迎来到登录页面')## def register(self):# print('欢迎来到注册页面')## def save(self):# print('欢迎来到存储页面')## choose_dic = {# 1: User.login,# 2: User.register,# 3: User.save,# }## while 1:# choose = input('请输入序号: \n1: 登录\n2: 注册\n3: 存储').strip()# obj = User()# choose_dic[int(choose)](obj)# class User:## user_List = [('login','登录'),('register','注册'),('save','存储')]## def login(self):# print('欢迎来到登录页面')## def register(self):# print('欢迎来到注册页面')## def save(self):# print('欢迎来到存储页面')### while 1:# choose = input('请输入序号: \n1: 登录\n2: 注册\n3: 存储\n').strip() # 1# obj = User()# getattr(obj,obj.user_List[int(choose)-1][0])() # getattr(obj,'login')其他模块
-----------------------------------name = '太白金星'def func(): print('in tbjx func')class C: area = '北京' def __init__(self,name): self.name = name def func(self): print('in B func')-----------------------------------# import tbjx# print(getattr(tbjx,'name'))# getattr(tbjx,'func')()import tbjx# 1. 找到tbjx对象 的C类,实例化一个对象.# print(getattr(tbjx,'C'))# obj = getattr(tbjx,'C')('123')# 2. 找到tbjx对象 的C类,通过对C类这个对象使用反射取到area.# print(getattr(tbjx.C,'area'))# 3. 找到tbjx对象 的C类,实例化一个对象,对对象进行反射取值.# obj = getattr(tbjx,'C')('赵海狗')# print(obj.name)# print(getattr(obj,'name'))函数与方法的区别
函数都是显性传参,方法都是隐性传参.
def func1(): passclass A: def func(self): pass# 1. 通过打印函数名的方式区别什么是方法,什么是函数. (了解)# print(func1)# print(A.func) # 通过类名调用的类中的实例方法叫做函数.# obj = A()# print(obj.func) # 通过对象调用的类中的实例方法叫方法.# 2 可以借助模块判断是方法还是函数.# from types import FunctionType# from types import MethodType## def func():# pass### class A:# def func(self):# pass## obj = A()# print(isinstance(func,FunctionType)) # True# print(isinstance(A.func,FunctionType)) # True# print(isinstance(obj.func,FunctionType)) # False# print(isinstance(obj.func,MethodType)) # True# 总结:# python 中一切皆对象,# 以及大部分内置类,都是由type元类(构建类)实例化得来的.# python 中一切皆对象,函数在某种意义上也是一个对象,函数这个对象是从FunctionType这个类实例化出来的.# python 中一切皆对象,方法在某种意义上也是一个对象,方法这个对象是从MethodType这个类实例化出来的.class A: @classmethod def func(cls,a): pass @staticmethod def func1(): pass# A.func(222)# A.func()# obj = A()# obj.func()# 总结: 如何判断类中的是方法还是函数.# 函数都是显性传参,方法都是隐性传参.特殊的双下方法
必考,对源码的研究,以后的开发
特殊的双下方法: 原本是开发python这个语言的程序员用的.源码中使用的.
str : 我们不能轻易使用.慎用.
双下方法: 你不知道你干了什么就触发某个双下方法.
______len______# class B:## def __init__(self,age):# self.name = name# self.age =age## def __len__(self):# print(self.__dict__)## return len(self.__dict__) # 2## b = B('leye',28)## print(len(b))# dict# print(len({'name': 'leye','age': 28}))______hash______
# class A(object):## pass## obj = A()# print(hash(obj))# str# print(hash('fdsaf'))______str______
# ***# class A:## def __init__(self,age):# self.name = name# self.age =age## def __str__(self):# print(666)# return f'姓名: {self.name} 年龄: {self.age}'## a = A('赵海狗',35)# b = A('李业',56)# c = A('华丽',18)# 打印对象触发__str__方法# print(f'{a.name} {a.age}')# print(f'{b.name} {b.age}')# print(f'{c.name} {c.age}')# print(a)# print(b)# print(c)# 直接str转化也可以触发.# print(str(a))______repr______
# print('我叫%s' % ('alex'))# print('我叫%r' % ('alex'))# print(repr('fdsaf'))# class A:## def __init__(self,age):# self.name = name# self.age =age## def __repr__(self):# print(666)# return f'姓名: {self.name} 年龄: {self.age}'## a = A('赵海狗',18)# # print(a)# print(repr(a))# class A:## def __init__(self,age):# self.name = name# self.age =age## def __str__(self):# return '777'### def __repr__(self):# return '666'## a = A('赵海狗',18)# # print(a)# print(a)______call______
***# 对象() 自动触发对象从属于类(父类)的__call__方法# class Foo:## def __init__(self):# pass## def __call__(self,*args,**kwargs):# print('__call__')## obj = Foo()# obj()______eq______
# class A(object):# def __init__(self):# self.a = 1# self.b = 2## def __eq__(self,obj):# # if self.a == obj.a and self.b == obj.b:# # return True# return True# x = A()# y = A()# print(x == y)# x = 1# y = 2# print(x+y)______del______
# __del__析构方法# class A:## def __del__(self):# print(666)## obj = A()# del obj______new______
# __new__ *** new一个对象 构造方法class A(object): def __init__(self): self.x = 1 print('in init function') def __new__(cls,**kwargs): print('in new function') return object.__new__(A) # object 342534# # 对象是object类的__new__方法 产生了一个对象.a = A()# 类名()# 1. 先触发 object的__new__方法,此方法在内存中开辟一个对象空间.# 2. 执行__init__方法,给对象封装属性.# print(a)# python中的设计模式: 单例模式# 一个类只允许实例化一个对象.# class A:## pass# obj = A()# print(obj)# obj1 = A()# print(obj1)# obj2 = A()# print(obj2)# 手写单例模式# class A:# __instance = None## def __init__(self,name):# self.name = name## def __new__(cls,**kwargs):# if not cls.__instance:# cls.__instance = object.__new__(cls)# return cls.__instance### obj = A('alex')# print(obj)# obj1 = A('李业')# print(obj1.name)# print(obj.name)______item______系列
______getitem______、______setitem______、______delitem______ 对对象做类似于字典的(增删改查)触发______item______系列
______delattr______ del obj.属性 ,机会触发此方法
class Foo: def __init__(self,name): self.name = name def __getitem__(self,item): print(item) print(666) # return self.__dict__[item] def __setitem__(self,key,value): self.__dict__[key] = value print(key) print(value) def __delitem__(self,key): print("del obj[key]时,我执行") def __delattr__(self,item): super().__delattr__(item) print(f"对象的{item}属性已经删除")f1 = Foo("sb")# print(f1["name"])# print(f1["age"])# f1[1] = 2# del f1[1]# del f1.name# print(f1.__dict__)______enter______ 或______exit______
______enter______ 或______exit______ with 上下文管理
实例化的对象的第二种方式class A: def __init__(self,name): self.name = name def __enter__(self): print(666) def __exit__(self,exc_type,exc_val,exc_tb): print(777)# obj = A("海狗")# 实例化对象的第二种方式:必须基于 __enter__ 以及 __exit__ 这两个方法with A("海狗") as obj: print(obj.name)执行顺序
class A: def __init__(self,text): self.text = text def __enter__(self): # 开启上下文管理器对象时触发此方法 self.text = self.text + '您来啦' # 第一步 print(11111) return self # 必须!!!将实例化的对象返回f1 def __exit__(self,exc_tb): # 执行完上下文管理器对象f1时触发此方法 print(333) # 第三步 self.text = self.text + ',这就走啦'with A('大爷') as f1: print(2222) print(f1.text) # 第二步print(f1.text) # 第四步______iter______
class A: def __init__(self,name): self.name = name def __iter__(self): for i in range(10): yIEld i def __next__(self): passobj = A("李业") # obj 一个可迭代对象# print("__iter__" in dir(obj))# for i in obj:# print(i)print(obj.name)o = iter(obj) # 迭代器print(next(o))print(next(o))print(next(o))print(next(o))print(next(o))print(next(o))总结
以上是内存溢出为你收集整理的day26_步入百万年薪的第二十六天——tyoe元类与object的联系、反射、函数与方法的区别、双下方法全部内容,希望文章能够帮你解决day26_步入百万年薪的第二十六天——tyoe元类与object的联系、反射、函数与方法的区别、双下方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)