1、双下方法:str,repr
repr():
print(1,'1')
print(repr(1))
print(repr('1'))
1 1
1
‘1’
(1)str
class A:
def __init__(self,name,salary):
self.name = name
self.salary = salary
def __str__(self):
return 'object:%s'%self.name
a = A('long',200)
print(a) #打印一个对象的时候就是调用a.__str__
输出结果:
object:long
(2)repr
class A:
def __init__(self,name,salary):
self.name = name
self.salary = salary
def __str__(self):
return 'object:%s'%self.name
def __repr__(self): #__repr__是__str__的备胎,当__str__找不到就用__repr__
return str(self.__dict__)
a = A('long',200)
print(a)
print(repr(a)) #找内置的a.__repr__
print('>>%r'%a) #%r已经偷偷调用了a.__repr__
输出结果:
object:long
{‘name’: ‘long’, ‘salary’: 200}{‘name’: ‘long’, ‘salary’: 200}
(3)len
class C:
def __init__(self,name):
self.name = name
self.student = []
def __len__(self):
return len(self.student)
def __str__(self):
return 'class'
py = C('python')
py.student.append('geng')
print(len(py))
print(py)
输出结果:
1
class
(4)del
class B:
def __del__(self): #析构函数:在删除一个对象之前进行一些收尾工作
print('天哪')
b = B()
del b #del即执行这个方法,又删除了变量
print(b)
(5) call
class A:
def __init__(self,name):
pass
def __call__(self):
print('天哪')
a = A('long')
a() #对象加括号相当于执行__call__方法
输出结果:
天哪
(6)item系列:getitem :获取,setitem:增加,delitem:删除
class Foo:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __getitem__(self, item):
if hasattr(self,item):
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key] = value
def __delitem__(self, key):
del self.__dict__[key]
f= Foo('long',12,'boy')
print(f['name'])
f['hobby'] = 'boy'
print(f['hobby'],f.hobby)
del f['hobby']
print(f.__dict__)
输出结果:
long
boy
boy
{‘name’: ‘long’, ‘age’: 12, ‘sex’: ‘boy’}
(7)new :构造方法:创建一个对象
class A:
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()
输出结果:
in new function
in init function
@当你第一次实例化这个类的时候,就创建一个实例化对象,当你之后再来实例化的时候,就用之前创建的对象
class A:
__instance = False
def __init__(self,name,age):
self.name = name
self.age = age
def __new__(cls, *args, **kwargs):
if cls.__instance:
return cls.__instance
cls.__instance = object.__new__(A)
return cls.__instance
a = A('long',12)
b = A('fei',14)
print(a.name)
print(b.name)
a.cloth = 'shuai'
print(b.cloth)
输出结果:
fei
fei
shuai
(8)__eq__根据自己设定的条件判断两个对象是否相等
class A:
def __init__(self,name):
self.name = name
def __eq__(self, other):
if self.name == other.name:
return True
else:
return False
obj1 = A('haha')
obj2 = A('haha')
obj3 = A('haha')
obj4 = A('ha')
print(obj1 == obj2)
print(obj3 == obj4)
输出结果:
True
False
(9)hash() hash
class A:
def __init__(self,name,sex):
self.name = name
self.sex = sex
def __hash__(self):
return hash(self.name+self.sex)
a = A('long','nan')
b = A('fei','nv')
print(hash(a))
print(hash(b))
输出结果:
5985551496917897309
-1053992547089410940
例:
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) #创建一个Card的没有属性的类,Card为类,数组里为属性
c1 = Card(2,'红心') #实例化一个对象
print(c1)
print(c1.suit)
输出结果:
Card(rank=2, suit=‘红心’)
红心
from collections import namedtuple
from random import choice,shuffle
import json
Card = namedtuple('Card',['rank','suit'])
class FranchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = ['红心','方板','梅花','黑桃']
def __init__(self):
self.cards = [Card(rank,suit) for rank in FranchDeck.ranks
for suit in FranchDeck.suits] #可得到self.cards = [Card(rank = '2',suit'红心),Card(rank = '2',suit'方块)....]
def __getitem__(self, item): #内部函数:可获取到cards列表中的数据
return self.cards[item]
def __len__(self):
return len(self.cards)
def __setitem__(self, key, value):
self.cards[key] = value
def __str__(self):
return json.dumps(self.cards,ensure_ascii=False) #序列化
deck = FranchDeck()
print(deck[0])
print(choice(deck)) #当执行choice方法时会调用内部__len__()方法
shuffle(deck) #当执行shuffle方法时会调用内部__setitem__()方法
print(deck[:5])
print(deck)
输出结果:
Card(rank=‘2’, suit=‘红心’)
Card(rank=‘3’, suit=‘黑桃’)
[Card(rank=‘8’, suit=‘红心’), Card(rank=‘J’, suit=‘黑桃’), Card(rank=‘3’, suit=‘黑桃’), Card(rank=‘3’, suit=‘梅花’), Card(rank=‘5’, suit=‘梅花’)]
[[“3”, “方板”], [“9”, “红心”], [“5”, “梅花”], [“5”, “方板”], [“Q”, “梅花”],… #打乱后的顺序
(10)set()
class A:
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
def __eq__(self, other):
if self.age == other.age and self.sex == other.sex:
return True
return False
def __hash__(self):
return hash(str(self.age)+self.sex)
a = A('long',12,'nan')
b = A('fei',12,'nan')
print(set((a,b))) #set依赖于__eq__和__hash__
输出结果:
{<main.A object at 0x00000234053A12E8>}