Python 类和对象相关的内置函数
        【摘要】 类和对象相关的内置函数知识!
    
    
    
    1、__str__和__repr__
改变对象的字符串显示__str__,__repr__
自定制格式化字符串__format__
#_*_coding:utf-8_*_
format_dict={
    'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
    'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
    'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
}
class School:
    def __init__(self,name,addr,type):
        self.name=name
        self.addr=addr
        self.type=type
    def __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 in format_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'))%s和%r:
class B:
     def __str__(self):
         return 'str : class B'
     def __repr__(self):
         return 'repr : class B'
b=B()
print('%s'%b)
print('%r'%b)2、item系列
1)、__getitem__\__setitem__\__delitem__
class Foo:
    def __init__(self,name):
        self.name=name
    def __getitem__(self, item):
        print(self.__dict__[item])
    def __setitem__(self, key, value):
        self.__dict__[key]=value
        
    def __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')
f1['age']=18
f1['age1']=19
del f1.age1
del f1['age']
f1['name']='alex'
print(f1.__dict__)2、__del__
析构方法,当对象在内存中被释放时,自动触发执行。
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
简单示范:
class Foo:
    def __del__(self):
        print('执行我啦')
f1=Foo()
del f1
print('------->')
#输出结果
执行我啦
------->3、__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)
a = A()
print(a.x)单例设计模式:
class Singleton: def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): cls._instance = object.__new__(cls) return cls._instance one = Singleton() two = Singleton() two.a = 3 print(one.a) # 3 # one和two完全相同,可以用id(), ==, is检测 print(id(one)) # 29097904 print(id(two)) # 29097904 print(one == two) # True print(one is two)
4、__call__
对象后面加括号,触发执行。
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
class Foo:
    def __init__(self):
        pass
    
    def __call__(self, *args, **kwargs):
        print('__call__')
obj = Foo() # 执行 __init__
obj()       # 执行 __call__5、with和__enter__,__exit__
with语句:
class A:
    def __enter__(self):
        print('before')
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('after')
with A() as a:
    print('123')with语句和init:
class A:
    def __init__(self):
        print('init')
        
    def __enter__(self):
        print('before')
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('after')
with A() as a:
    print('123')with和文件操作:
class Myfile:
    def __init__(self,path,mode='r',encoding = 'utf-8'):
        self.path = path
        self.mode = mode
        self.encoding = encoding
    def __enter__(self):
        self.f = open(self.path, mode=self.mode, encoding=self.encoding)
        return self.f
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()
with Myfile('file',mode='w') as f:
    f.write('wahaha'with和pickle:
import  pickle
class MyPickledump:
    def __init__(self,path):
        self.path = path
    def __enter__(self):
        self.f = open(self.path, mode='ab')
        return self
    def dump(self,content):
        pickle.dump(content,self.f)
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()
class Mypickleload:
    def __init__(self,path):
        self.path = path
    def __enter__(self):
        self.f = open(self.path, mode='rb')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()
    def load(self):
         return pickle.load(self.f)
    def loaditer(self):
        while True:
            try:
                yield  self.load()
            except EOFError:
                break
                
# with MyPickledump('file') as f:
#      f.dump({1,2,3,4})
with Mypickleload('file') as f:
    for item in f.loaditer():
        print(item)with和pickle和iter:
import  pickle
class MyPickledump:
    def __init__(self,path):
        self.path = path
    def __enter__(self):
        self.f = open(self.path, mode='ab')
        return self
    def dump(self,content):
        pickle.dump(content,self.f)
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()
class Mypickleload:
    def __init__(self,path):
        self.path = path
    def __enter__(self):
        self.f = open(self.path, mode='rb')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        self.f.close()
    def __iter__(self):
        while True:
            try:
                yield  pickle.load(self.f)
            except EOFError:
                break
# with MyPickledump('file') as f:
#      f.dump({1,2,3,4})
with Mypickleload('file') as f:
    for item in f:
        print(item)6、__len__
class A: def __init__(self): self.a = 1 self.b = 2 def __len__(self): return len(self.__dict__) a = A() print(len(a))
7、__hash__
class A: def __init__(self): self.a = 1 self.b = 2 def __hash__(self): return hash(str(self.a)+str(self.b)) a = A() print(hash(a))
8、__eq__
class A: 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 a = A() b = A() print(a == b)
纸牌游戏:
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]
    def __len__(self):
        return len(self._cards)
    def __getitem__(self, item):
        return self._cards[item]
deck = FranchDeck()
print(deck[0])
from random import choice
print(choice(deck))
print(choice(deck))纸牌游戏2:
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]
    def __len__(self):
        return len(self._cards)
    def __getitem__(self, item):
        return self._cards[item]
    def __setitem__(self, key, value):
        self._cards[key] = value
deck = FranchDeck()
print(deck[0])
from random import choice
print(choice(deck))
print(choice(deck))
from random import shuffle
shuffle(deck)
print(deck[:5])面试题:
class Person:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def __hash__(self):
        return hash(self.name+self.sex)
    def __eq__(self, other):
        if self.name == other.name and self.sex == other.sex:return True
p_lst = []
for i in range(84):
    p_lst.append(Person('egon',i,'male'))
print(p_lst)
print(set(p_lst))
            【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
                cloudbbs@huaweicloud.com
                
            
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)