python笔记(面向对象进阶:内置函数)

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>}

猜你喜欢

转载自blog.csdn.net/qq_41433183/article/details/84437050