一、内置函数的补充

isinstance(obj,cls)检查是否obj是否是类 cls 的对象

class Foo:
pass obj=Foo()
print(isinstance(obj,Foo)) # 推荐使用该函数来判断一个函数的类型,判断obj(对象)是否是Foo(类)的对象,是则为真,否则为假 也可用下面main方法判断
print(type(obj) is Foo)

issubclass(sub, super)检查sub类是否是 super 类的派生类

 class Foo(object):
2 pass
3
4 class Bar(Foo):
5 pass
6
7 issubclass(Bar, Foo)

二、反射

 #下述四个函数是专门用来操作类与对象属性的,如何操作?

#通过字符串来操作类与对象的属性,这种操作称为反射
class People:
country="China"
def __init__(self,name):
self.name=name
def tell(self):
print('%s is aaa' %self.name) obj=People('egon') # 1、hasattr #判断object中有没有一个name字符串对应的方法或属性
# print(hasattr(People,'country')) #判断类中有没有一个 'country' 字符串对应的方法或属性
# print('country' in People.__dict__) #判断country是否在类的字典中
# print(People.__dict__) #拿到类的字典
# print(hasattr(obj,'name'))
# print(hasattr(obj,'country')) #判断obj(对象)有没有一个 'country' 字符串对应的方法或属性
# print(hasattr(obj,'tell')) # 2、getattr
# x=getattr(People,'country') #获取类中country的属性是China
# x=getattr(People,'country1',None) #获取country1的属性,没有则返回None
# print(x) # f=getattr(obj,'tell',None)#obj.tell #获取obj(对象)中tell的函数属性,没有则返回None
# print(f == obj.tell) #True
# f()
# obj.tell() #与f()调用结果相等 # 3、setattr #设置属性
# People.x=111
# setattr(People,'x',111)
# print(People.x) # obj.age=18
# setattr(obj,"age",18)
# print(obj.__dict__) # 4、delattr #删除属性
# del People.country
# delattr(People,"country")
# print(People.__dict__) # del obj.name
# delattr(obj,"name")
# print(obj.__dict__) class Foo:
def run(self):
while True:
cmd=input('cmd>>: ').strip()
# print('%s run...' %cmd)
if hasattr(self,cmd): #查看属性,用户输入的字符串是download或upload程序才会获得该属性,否则重复循环输入
func=getattr(self,cmd) #获取属性
func() def download(self):
print('download....') def upload(self):
print('upload...') obj=Foo()
obj.run()

三、__str__ 方法

class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def __str__(self): #改变对象的字符串显示,如果要把一个类的实例变成 str,就需要实现特殊方法__str__():
# print('========>') #__str__()用于显示给用户
return '<名字:%s 年龄:%s 性别:%s>' %(self.name,self.age,self.sex) obj=People('egon',18,'male')
print(obj) #print(obj.__str__()) # l=list([1,2,3])
# print(l)

四、__del__ 方法

 import time
#
# class People:
# def __init__(self,name,age,sex):
# self.name=name
# self.age=age
# self.sex=sex
#
# def __del__(self): # 在对象被删除的条件下,自动执行,没有被删除时不会执行
# print('__del__')
#
#
# obj=People('egon',18,'male')
# time.sleep(5) #通过延迟后删除属性,可以看到__del__,才会自动执行
# del obj #obj.__del__() # class Mysql:
# def __init__(self,ip,port):
# self.ip=ip
# self.port=port
# self.conn=connect(ip,port) # 申请系统资源
#
# def __del__(self): #
# self.conn.close()
#
# obj=Mysql('1.1.1.1',3306) class MyOpen:
def __init__(self,filepath,mode="r",encoding="utf-8"):
self.filepath=filepath
self.mode=mode
self.encoding=encoding
self.fobj=open(filepath,mode=mode,encoding=encoding) def __str__(self): #定义一个字符串并将其值返回
msg="""
filepath:%s
mode:%s
encoding:%s
""" %(self.filepath,self.mode,self.encoding)
return msg def __del__(self):
self.fobj.close() f=open('a.txt',mode='r',encoding='utf-8') f=MyOpen('aaa.py',mode='r',encoding='utf-8')
print(f.filepath,f.mode,f.encoding)
print(f) print(f.fobj)
res=f.fobj.read()
print(res)

五、元类

定义:

元类:类的类就是元类
 code="""
# global x
# x=0
# y=2
# """
# global_dic={'x':100000}
# local_dic={}
# exec(code,global_dic,local_dic)
#
# print(global_dic)
# print(local_dic) #
# code="""
# x=1
# y=2
# def f1(self,a,b):
# pass
# """
# local_dic={}
# exec(code,{},local_dic)
# print(local_dic)
# #1、一切皆为对象: # Chinese=type(...)
# class Chinese:
# country="China"
#
# def __init__(self,name,age,sex):
# self.name=name
# self.age=age
# self.sex=sex
#
# def speak(self):
# print('%s speak Chinese' %self.name)
#
# print(Chinese)
# p=Chinese('egon',18,'male')
# print(type(p)) # print(type(Chinese))
# 元类:类的类就是元类,
#我们用class定义的类使用来产生我们自己的对象的
#内置元类type是用来专门产生class定义的类的 class Foo: #Foo=type(...)
pass # print(type(Foo))
# f=Foo
#
# l=[Foo,]
# print(l) #2、用内置的元类type,来实例化得到我们的类
# class_name='Chinese'
# class_bases=(object,)
# class_body="""
# country="China"
# def __init__(self,name,age,sex):
# self.name=name
# self.age=age
# self.sex=sex
# def speak(self):
# print('%s speak Chinese' %self.name)
# """
# class_dic={}
# exec(class_body,{},class_dic) # 类的三大要素
# print(class_name,class_bases,class_dic) # Chinese=type(class_name,class_bases,class_dic)
# print(Chinese) # p=Chinese('egon',18,'male')
# print(p.name,p.age,p.sex) #3、储备知识__call__
# class Foo:
# def __init__(self):
# pass
# def __str__(self):
# return '123123'
#
# def __del__(self):
# pass
#
# # 调用对象,则会自动触发对象下的绑定方法__call__的执行,
# # 然后将对象本身当作第一个参数传给self,将调用对象时括号内的值
# #传给*args与**kwargs
# def __call__(self, *args, **kwargs):
# print('__call__',args,kwargs)
#
#
# obj=Foo()
# # print(obj)
#
# obj(1,2,3,a=1,b=2,c=3) # # #4 、自定义元类:
# class Mymeta(type):
# # 来控制类Foo的创建
# def __init__(self,class_name,class_bases,class_dic): #self=Foo
# # print(class_name)
# # print(class_bases)
# # print(class_dic)
# if not class_name.istitle():
# raise TypeError('类名的首字母必须大写傻叉')
#
# if not class_dic.get('__doc__'):
# raise TypeError('类中必须写好文档注释,大傻叉')
#
# super(Mymeta,self).__init__(class_name,class_bases,class_dic)
#
# # 控制类Foo的调用过程,即控制实例化Foo的过程
# def __call__(self, *args, **kwargs): #self=Foo,args=(1111,) kwargs={}
# # print(self)
# # print(args)
# # print(kwargs)
#
# #1 造一个空对象obj
# obj=object.__new__(self)
#
# #2、调用Foo.__init__,将obj连同调用Foo括号内的参数一同传给__init__
# self.__init__(obj,*args,**kwargs)
#
# return obj
#
#
#
# #Foo=Mymeta('Foo',(object,),class_dic)
# class Foo(object,metaclass=Mymeta):
# """
# 文档注释
# """
# x=1
# def __init__(self,y):
# self.Y=y
#
# def f1(self):
# print('from f1')
#
#
# obj=Foo(1111) #Foo.__call__()
#
# # print(obj)
# # print(obj.y)
# # print(obj.f1)
# # print(obj.x) # 单例模式
import settings class MySQL:
__instance=None
def __init__(self,ip,port):
self.ip=ip
self.port=port @classmethod
def singleton(cls):
if not cls.__instance:
obj=cls(settings.IP, settings.PORT)
cls.__instance=obj
return cls.__instance obj1=MySQL('1.1.1.2',3306)
obj2=MySQL('1.1.1.3',3307)
obj3=MySQL('1.1.1.4',3308) # obj4=MySQL(settings.IP,settings.PORT)
# print(obj4.ip,obj4.port) obj4=MySQL.singleton()
obj5=MySQL.singleton()
obj6=MySQL.singleton() print(obj4 is obj5 is obj6)

  

												

内置函数、反射、__str__、__del__、元类的更多相关文章

  1. python基础语法20 面向对象5 exec内置函数的补充,元类,属性查找顺序

    exec内置函数的补充 exec: 是一个python内置函数,可以将字符串的代码添加到名称空间中; - 全局名称空间 - 局部名称空间 exec(字符串形式的代码, 全局名称空间, 局部名称空间) ...

  2. 封装,封装的原理,Property ,setter ,deleter,多态,内置函数 ,__str__ , __del__,反射,动态导入模块

    1,封装 ## 什么是封装 what 对外隐藏内部的属性,以及实现细节,并给外部提供使用的接口 学习封装的目的:就是为了能够限制外界对内部数据的方法 注意 :封装有隐藏的意思,但不是单纯的隐藏 pyt ...

  3. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  4. day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()

    __str__()__repr__()__len__() str() 转字符串repr() 让字符原形毕露的方法len() 计算长度 内置的方法很多,但是并不是全部都在object中,比如len(), ...

  5. beetl的内置函数 (如strutil 工具类)

    转自:http://ibeetl.com/guide/ 2.19. 函数调用 Beetl内置函数请参考附录,以下列出了常用的函数 date 返回一个java.util.Date类型的变量,如 date ...

  6. Day 28面向对象的进阶-内置函数(__new__,__del__)

     元类 创造 类  所有类的type 都是他的元类 类创造 对象   具体创造对象的方法 __new__方法 class 类名(classmata = type)#默认是 class 类名(class ...

  7. python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类

    isinstance   是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass  是python 中的内置函数,  用来一个类A是不是另外一个 ...

  8. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  9. 第8.17节 Python __repr__方法和__str__方法、内置函数repr和str的异同点对比剖析

    一. 引言 记得刚开始学习Python学习字符串相关内容的时候,查了很多资料,也做了些测试,对repr和str这两个函数的返回值老猿一直没有真正理解,因为测试发现这两个函数基本上输出时一样的.到现在老 ...

  10. day25 组合和内置函数

    day25 组合和内置函数 一.组合 # 解决类与类之间代码冗余问题: 1. 继承 2. 组合 组合:一个对象拥有一个属性, 属性的值必须是另外一个对象 继承满足的是:什么是什么的关系 # is-a ...

随机推荐

  1. Aliplayer视频点播加密播放

    Aliplayer视频播放器填坑 aliplayer视频点播分为Flash和HTML5两个版本,移动端不支持Flash播放器.Flash播放器兼容IE8+,HTML5播发器支持比较新的浏览器,对浏览器 ...

  2. Create GUID / UUID in JavaScript?

    Code function uuidv4() { return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => (c ^ crypto.g ...

  3. JavaIO学习:字节流

    JavaIO流之字节流 字节流 抽象基类:InputStream,OutputStream. 字节流可以操作任何数据. 注意: 字符流使用的数组是字符数组,char[] chs : 字节流使用的数组是 ...

  4. Caused by: java.lang.ClassCastException: org.springframework.web.SpringServletContainerInitializer cannot be cast to javax.servlet.ServletContainerInitializer。。。。。检查一下servlet-api是否冲突了?

    原因:jar包发生冲突.在我的pom.xml文件中 <dependency>      <groupId>javax.servlet</groupId>       ...

  5. mini QQ(项目一)

    一个多人聊天工具(C/S结构),实现了如下功能: 一个可视化窗口,支持鼠标点击事件 注册功能,用户可以注册自己的聊天账号, 注册信息包括: 账号名(可以用姓名来替代账号,支持中文), 密码(聊天框输入 ...

  6. HttpClient到底该不该using?

    HttpClient实例是否应该释放掉? 从源代码中可以的看到httpClient类最上层实现了IDisposable接口,看到该接口我们下意识就是要用using(自动释放)代码块包含起.或者自己手动 ...

  7. C#7语法快速参考-第一章 Hello World

    选择IDE 要开始使用C#编程,您需要一个支持微软.NET框架的集成开发环境(IDE).最受欢迎的选择是微软自己的Visual Studio.初学可以使用Visual Studio Community ...

  8. 2019-09-09 memcache

    什么是缓存呢???缓存就是存贮数据(使用频繁的数据)的临时地方缓存可以认为是数据的大池子 一.数据缓存这里所说的数据缓存是指数据库查询缓存,每次访问页面的时候,都会先检测相应的缓存数据是否存在,如果不 ...

  9. 响应式开发 纯CSS实现隐藏菜单栏

    // 将要隐藏的菜单设置 display: block; // 然后在菜单上面设置一个点击选项,如“菜单”<label for="toggle-checkbox" id=&q ...

  10. JS 树形结构与数组结构相互转换、在树形结构中查找对象

    总是有很多需求是关于处理树形结构的,所以不得不总结几个常见操作的写法.¯\_(ツ)_/¯ 首先假设有一个树形结构数据如下 var tree=[ { 'id': '1', 'name': '教学素材管理 ...