首页 > 编程语言 > 详细

python -- 类中--内置方法

时间:2018-12-12 23:26:19      阅读:335      评论:0      收藏:0      [点我收藏+]

isinstance 和  issubclass

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

class A(object):pass
class B(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__

技术分享图片
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__的备胎
如果__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
‘‘‘
print(format(s1,nat))
print(format(s1,tna))
print(format(s1,tan))
print(format(s1,asfdasdffd))
View Code
技术分享图片
class B:

     def __str__(self):
         return str : class B  ------%s

     def __repr__(self):
         return repr : class B------%r


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

2)__del__

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

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

技术分享图片
class Foo:
    def __del__(self):
            print(执行我了)
 f=Foo()
del  f
print(---->)
#输出结果
执行我了
---->
View Code

3)item系列

__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)
print(f1.name)
f1[age]=18
f1[age1]=19
del f1.age1
del f1[age]
f1[name]=alex
print(f1.__dict__)
View Code

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

技术分享图片
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()
print(a.x)
View Code

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

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

技术分享图片
class Student():
    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(对象))

技术分享图片
class A:
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 1

    def __len__(self):
        return len(self.__dict__)------查的长度
a = A()
print(len(a))
View Code

7)__hash__   (每次执行__hash__都会改变,在一次执行的过程中对同一个值的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))
View Code

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()
print(a)
b = A()
print(b)
print(a == b)
View Code

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

技术分享图片
class Num:
    def __init__(self, max_num):
        self.max_num = max_num
        self.count = 0
        
    def __iter__(self):
        return self

    def __next__(self):
        if self.count < self.max_num:
            self.count += 1
            return self.count
        else:
            raise StopIteration(已经到达临界)
        
num = Num(10)
for i in num:
    print(i)  # 循环打印1---10
View Code

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

技术分享图片
class Student:
    def __getattr__(self, item):
        print(访问一个不存在的属性时候触发)
        return 不存在

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

    def __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--->报错

技术分享图片
class People:
    a = 200

class Student(People):
    a = 100

    def __init__(self, a):
        self.a = a

    def __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__

技术分享图片
class MySQL:
    def connect(self):
        print(启动数据库连接,申请系统资源)

    def execute(self):
        print(执行sql命令,操作数据)

    def finish(self):
        print(数据库连接关闭,清理系统资源)

    def __enter__(self):  # with的时候触发,并赋给as变量
        self.connect()
        return self

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

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

13)__doc__  (类的描述信息)

技术分享图片
class Foo:
    """ 描述类信息,这是用于看片的神奇 """

    def func(self):
        pass

print Foo.__doc__
#输出:类的描述信息
View Code

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

技术分享图片
from lib.aa import C

obj = C()
print obj.__module__  # 输出 lib.aa,即:输出模块
print obj.__class__      # 输出 lib.aa.C,即:输出类
View Code
技术分享图片
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))
面试题

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

 

 

 

 

       

 

python -- 类中--内置方法

原文:https://www.cnblogs.com/tianshuai1/p/10111490.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!