python基础-类内置函数、类内置方法

来源:互联网 发布:淘宝隐形眼镜可靠吗 编辑:程序博客网 时间:2024/05/29 18:34

      • 内置函数
      • 内置方法
        • _str_和_repr_
        • _del_
        • item系列
        • _call_
        • _len_
        • _hash_
        • _eq_

内置函数

print("----是否是实例-------")from collections import Iterableprint(isinstance([],Iterable))class A:passclass B(A):passb = B()print(isinstance(b,A))print(isinstance(b,object))print("----是否是子类-------")class A:passclass B(A):passprint(issubclass(B,A))print(issubclass(A,B))print(issubclass(A,object))print(issubclass(B,object))print("----vars-------")#看全局a = 1b = 2print(vars())#k_vprint(dir())#kprint("----vars类对象-------")class A:    c = 1    d = 2    def func(self,name):        self.name = nameprint(vars(A))a = A()a.func("safly")#看对象print(vars(a))

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo/3.内置函数.py----是否是实例-------TrueTrueTrue----是否是子类-------TrueFalseTrueTrue----vars-------{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x007CB3F0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python/py_pro/demo/3.内置函数.py', '__cached__': None, 'Iterable': <class 'collections.abc.Iterable'>, 'A': <class '__main__.A'>, 'B': <class '__main__.B'>, 'b': 2, 'a': 1}['A', 'B', 'Iterable', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b']----vars类对象-------{'__module__': '__main__', 'c': 1, 'd': 2, 'func': <function A.func at 0x02AB1810>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}{'name': 'safly'}Process finished with exit code 0

内置方法

_str__repr_

改变对象的字符串显示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 (not format_spec) or (format_spec not in format_dict):            print("-------format_spec---",format_spec)            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)print("--------------------------")'''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'))print(format(s1))

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.pyfrom repr:  School(oldboy1,北京)from str:  (oldboy1,北京)(oldboy1,北京)--------------------------oldboy1-北京-私立私立:oldboy1:北京私立/北京/oldboy1-------format_spec--- asfdasdffdoldboy1-北京-私立-------format_spec--- oldboy1-北京-私立Process finished with exit code 0
class B:    def __str__(self):        return 'str : class B'    def __repr__(self):        return 'repr : class B'b = B()print('%s' % b)print('%r' % b)

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.pystr : class Brepr : class B

_del_

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

class A:    def __del__(self):        print('执行我啦!')        self.b.close()f = open('file','w')a = A()a.b = fdel a

输出如下:

执行我啦!

析构方法
这个方法只有在执行del A类的对象的时候才被触发
且先执行代码中的内容,再删除对象
如果我删除了这个对象,它跟着还有一些其他的附属的内容也没有用了
我们就可以在这个方法中回收掉

item系列

class Foo:    def __init__(self,name):        self.name=name    def __getitem__(self, item):        print(self.__dict__[item])    def __setitem__(self, key, value):        print(key,value)        self.__dict__[key] = value    def __delitem__(self, key):        print('__delitem__ obj[key]时,我执行')        self.__dict__.pop(key)    def __delattr__(self, item):        print('__delattr__ obj.key时,我执行')        self.__dict__.pop(item)f1=Foo('sb')print("--setitem----执行------")f1['age']=18print("--getitem----执行------")f1['age']print("--delitem----执行------")del f1['age']# f1['age']f1['name']='alex'print(f1.__dict__)print("--delattr----执行------")del f1.name

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py--setitem----执行------age 18--getitem----执行------18--delitem----执行------__delitem__ obj[key],我执行name alex{'name': 'alex'}--delattr----执行------__delattr__ obj.key时,我执行Process finished with exit code 0

_call_

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

class Foo:    def __init__(self):        pass    def __call__(self, *args, **kwargs):        print('__call__')obj = Foo()  # 执行 __init__obj()  # 执行 __call__

输出如下:

__call__

_len_

class A:    def __init__(self):        self.a = 1        self.b = 2    def __len__(self):        return len(self.__dict__)a = A()print(a.__dict__)print(len(a))

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/demo.py{'a': 1, 'b': 2}2Process finished with exit code 0

_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))

输出如下:

1784390486

_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 Truea = A()b = A()print(a == b)

输出如下:

True