python 类的内置方法_python -- 类中--内置方法

isinstance 和  issubclass

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

class A(object):passclassB(A):pass

b=B()

print(isinstance(b,B)) #如果b是B的对象 就返回True,反之False

print(isinstance(b,A)) #如果b是A的对象 就返回True,反之False

issubclass(A,B)  检测B是否继承A

class A(object):pass

class B(A):pass

print(issubclass(B,A)) #如果B继承A 就返回True,反之Fasle

类的内置方法

1)改变对象的字符串显示 __str__,__repr__

自定制格式化字符串 __format__

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

format_dict={'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型

'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址

'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名

}classSchool:def __init__(self,name,addr,type):

self.name=name

self.addr=addr

self.type=typedef __repr__(self):return 'School(%s,%s)' %(self.name,self.addr)def __str__(self):return '(%s,%s)' %(self.name,self.addr)def __format__(self, format_spec):#if format_spec

if not format_spec or format_spec not informat_dict:

format_spec='nat'fmt=format_dict[format_spec]return fmt.format(obj=self)

s1=School('oldboy1','北京','私立')print('from repr:',repr(s1))print('from str:',str(s1))print(s1)'''str函数或者print函数--->obj.__str__()

repr或者交互式解释器--->obj.__repr__()

如果__str__没有被定义,那么就会使用__repr__来代替输出

注意:这俩方法的返回值必须是字符串,否则抛出异常'''

print(format(s1,'nat'))print(format(s1,'tna'))print(format(s1,'tan'))print(format(s1,'asfdasdffd'))

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classB:def __str__(self):return 'str : class B' ------%sdef __repr__(self):return 'repr : class B'------%r

b=B()print('%s'%b)print('%r'%b)

%s和%r

2)__del__

析构方法,当对象在内存中被释放,自动触发执行.

注意:此方法一般无需定义,因为python是一门高级语言.

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classFoo:def __del__(self):print('执行我了')

f=Foo()delfprint('---->')#输出结果

执行我了---->

View Code

3)item系列

__getitem__\__setitem__\__delitem__

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classFoo:def __init__(self,name):

self.name=namedef __getitem__(self, item):print(self.__dict__[item]) #直接生成字典

def __setitem__(self, key, value):

self.__dict__[key]=valuedef __delitem__(self, key):print('del obj[key]时,我执行')

self.__dict__.pop(key)def __delattr__(self, item):print('del obj.key时,我执行')

self.__dict__.pop(item)

f1=Foo('sb')print(f1.name)

f1['age']=18f1['age1']=19

delf1.age1del f1['age']

f1['name']='alex'

print(f1.__dict__)

View Code

4)__new__  \  __init__(实例化      构造方法(单例模式))/  初始化方法

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classA:def __init__(self):

self.x= 1

print('in init function')def __new__(cls, *args, **kwargs):print('in new function')return object.__new__(A, *args, **kwargs)------提供了一个类实例化的时候提供的一个所需要的内存空间

a=A()print(a.x)

View Code

5)__call__ (对象后面加括号,触发执行)

注意:构造方法的执行是由创建对象触发的,即:对象 = 类名():而对于__call__方法的执行是由对象后加括号触发的 ,即:对象() 或者 类()

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classStudent():def __init__(self,name,age):

self.name=name

self.age=age#def call(self):pass

def __call__(self, *args, **kwargs):print('调用我啦')

alex= Student('alex',83)-----执行__init__

alex()----执行__call__

View Code

6)__len__ (len(对象))

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classA:def __init__(self):

self.a= 1self.b= 2self.c= 1

def __len__(self):return len(self.__dict__)------查的长度

a=A()print(len(a))

View Code

7)__hash__(每次执行__hash__都会改变,在一次执行的过程中对同一个值的hash结果总是不变的)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classA:def __init__(self):

self.a= 1self.b= 2

def __hash__(self):return hash(str(self.a)+str(self.b))

a=A()print(hash(a))

View Code

8)__eq__( 判断)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classA:def __init__(self):

self.a= 1self.b= 2

def __eq__(self,obj):if self.a == obj.a and self.b ==obj.b:returnTrue

a=A()print(a)

b=A()print(b)print(a == b)

View Code

9)__iter__和__next__(这两个方法用于将一个对象模拟成序列)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classNum:def __init__(self, max_num):

self.max_num=max_num

self.count=0def __iter__(self):returnselfdef __next__(self):if self.count

self.count+= 1

returnself.countelse:raise StopIteration('已经到达临界')

num= Num(10)for i innum:print(i) #循环打印1---10

View Code

10)__getattr__\__setattr__\__delattr__(访问,设置和删除)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classStudent:def __getattr__(self, item):print('访问一个不存在的属性时候触发')return '不存在'

def __setattr__(self, key, value):print('设置一个属性值的时候触发')#self.key = value # 这样会无限循环

self.__dict__[key] =valuedef __delattr__(self, item):print('删除一个属性的时候触发')if self.__dict__.get(item, None):del self.__dict__[item]

stu=Student()

stu.name= 'zlw' #设置一个属性值的时候触发

print(stu.noexit) #访问一个不存在的属性时候触发 , 返回'不存在'

del stu.name #删除一个属性的时候触发

View Code

11)__getattribute__(属性访问截断器)

属性查找顺序:

实例的 getattribute-->实例对象字典--.实例所在类字典--->实例所在类的父类(MRO顺序)字典-->实例所在类的getattr--->报错

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classPeople:

a= 200

classStudent(People):

a= 100

def __init__(self, a):

self.a=adef __getattr__(self, item):print('没有找到:', item)def __getattribute__(self, item):print('属性访问截断器')if item == 'a':return 1

return super().__getattribute__(item)

stu= Student(1)print(stu.a) #1

View Code

12)__enter__和__exit__

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classMySQL:defconnect(self):print('启动数据库连接,申请系统资源')defexecute(self):print('执行sql命令,操作数据')deffinish(self):print('数据库连接关闭,清理系统资源')def __enter__(self): #with的时候触发,并赋给as变量

self.connect()returnselfdef __exit__(self, exc_type, exc_val, exc_tb): #离开with语句块时触发

self.finish()

with MySQL() as mysql:

mysql.execute()#结果:#启动数据库连接,申请系统资源#执行sql命令,操作数据#数据库连接关闭,清理系统资源

View Code

13)__doc__ (类的描述信息)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classFoo:"""描述类信息,这是用于看片的神奇"""

deffunc(self):pass

print Foo.__doc__

#输出:类的描述信息

View Code

14)__module__ 和__class__(  当前操作的对象在那个模块\当前操作的对象的类是什么)

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from lib.aa importC

obj=C()print obj.__module__ #输出 lib.aa,即:输出模块

print obj.__class__ #输出 lib.aa.C,即:输出类

View Code

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classFranchDeck:

ranks= [str(n) for n in range(2,11)] + list('JQKA')

suits= ['红心','方板','梅花','黑桃']def __init__(self):

self._cards= [Card(rank,suit) for rank inFranchDeck.ranksfor suit inFranchDeck.suits]def __len__(self):returnlen(self._cards)def __getitem__(self, item):returnself._cards[item]def __setitem__(self, key, value):

self._cards[key]=value

deck=FranchDeck()print(deck[0])from random importchoiceprint(choice(deck))print(choice(deck))from random importshuffle

shuffle(deck)print(deck[:5])

纸牌游戏

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

classPerson:def __init__(self,name,age,sex):

self.name=name

self.age=age

self.sex=sexdef __hash__(self):return hash(self.name+self.sex)def __eq__(self, other):if self.name == other.name and self.sex == other.sex:returnTrue

p_lst=[]for i in range(84):

p_lst.append(Person('egon',i,'male'))print(p_lst)print(set(p_lst))

面试题

希望大家多多关注,多多评论!!!


版权声明:本文为weixin_42513814原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。