4-19 面向对象 的内置方法

1,__str__ 和 __repr__

__str__就是改变对象的字符串显示。

Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,这就是“字符串表示形式”。repr就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式。如果没有实现__repr__,当我们再控制台里打印一个变量的实例时,得到的字符串可能会是<__main__.Object at 0x14af07dbe80>,这个表示的是打印的对象,以及对象的内存地址。

str()的结果是依赖obj.__str__()

print(obj)的结果是依赖obj.__str__()

%s的结果是依赖obj.__str__()

repr的结果是依赖obj.__repr__()

%r的结果是依赖obj.__repr__()

所以说repr是str得到备胎。

在类中,当把对象作为参数传入print()时,会自动调用对象的__str__方法,但是当__str__方法不存在时,则会调用__repr__方法。

所以,如果你只想实现这两个特殊方法中的一个,建议还是选择__repr__方法。

class List:
    def __init__(self,*args):
        self.l = list(args)
    def __str__(self):
        return ‘[%s]‘%(‘,‘.join([str(i) for i in self.l]))
l = List(1,2,3,4,5)
print(l)   #--> l.__str__()   # object类中的__str__就是返回一个数据的内存地址
print(l)
print(str(l))
print(‘%s‘%l)
print(obj)   的结果 是 obj.__str__()的结果
str(obj)

因为class   int 和class  str 的__repr__的方法不同。

class int:
    def __repr__(self):
        return str(1)
class str2:
    def __repr__(self):
        return "%s"%str(1)
a = int()
b = str2()
print(repr(a))
print(repr(b))

2,__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 __format__(self, 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(format(s1,‘nat‘))
print(format(s1,‘tna‘))
print(format(s1,‘tan‘))
print(format(s1,‘asadafsfsf‘))

3,__del__

析构方法,在删除一个对象的时候,做了一些收尾工作。

class A:    def __init__(self):        self.f = open(‘文件‘,‘w‘)    def __del__(self):        self.f.close()        print(‘执行我啦‘)a = A()del aprint(a)print(‘aaa‘)

4,__new__构造方法

创建对象的过程就是__new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)

利用这个方法和类属性的特性可以实现设计模式中的单例模式.单例模式是指创建唯一对象吗,单例模式设计的类只能实例化一个对象。

class B:
    __instance = None
    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            obj = object.__new__(cls)
            cls.__instance = obj
        return cls.__instance
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func(self):
        print(self.name)
a = B(‘alex‘,80)
b = B(‘egon‘,20)
print(a)
print(b)
print(a.name)
print(b.name)

5,__call__ (callable就是判断一个对象可否被调用)

在类内一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__内置方法。

class Teacher:
    def __call__(self):
        print(123)
        def call(self):print(123)
t = Teacher()
#t.call()
t()
print(callable(Teacher))
print(callable(t))

6,__eq__      ==  判断self对象是否等于other对象

class A:
    def __eq__(self, other):
        # if self.__dict__ == other.__dict__:
            return True
# __eq__()
a = A()
a.name = ‘alex‘
b = A()
b.name = ‘egon‘
print(a)
print(b)
print(a == b)

7,__items__系列

__getitem__(self,key):返回键对应的值。
__setitem__(self,key,value):设置给定键的值。
__delitem__(self,key):删除给定键对应的元素。

当我们对类的属性item进行下标的操作时,首先会被__getitem__()、__setitem__()、__delitem__()拦截,从而进行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。

class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self,item):
        return  self.__dict__[item]

    def __setitem__(self, key, value):
        self.__dict__[key]=value

    def __delitem__(self, key):
        print(‘del obj[key]时,我执行‘)
        self.__dict__.pop(key)

f = Foo(‘alex‘)
# f.name = ...
print(f[‘name‘])    # f.__getitem__(‘name‘)
f[‘age‘]  = 18      # 赋值
print(f.age)         # 自带的语法
print(f[‘age‘])     # 修改
f[‘age‘]  = 80
print(f[‘age‘])
print(f.__dict__)# 通过实现__getitem__得到的
del f[‘age‘]
print(f.age)         # 删除

原文地址:https://www.cnblogs.com/yzxing/p/8884535.html

时间: 2024-07-29 23:48:59

4-19 面向对象 的内置方法的相关文章

python面向对象常用内置方法

class Person(): #构造函数 def __init__(self,name,age=None): self.name=name self.age=age self.lists=[1,3,5] self.dicts={} #打印函数,类似java中的toSring() def __str__(self): return 'Peason(%s)'%self.name #对象的字典表示 def __dict__(self): return {'name':self.name} #对象相加

面向对象进阶——内置方法(二)

七.__setitem__, __getitem__, __delitem__ item系列 class Foo: def __init__(self, name): self.name = name def __getitem__(self, item): # print('getitem...') #print(item) return self.__dict__.get(item) # 字典get方法有则取值,无也不会报错 def __setitem__(self, key, value)

python-面向对象速查表-内置方法-内置函数-内置属性(只整理了部分内容)

今日临时总结的内容,可能还有些不正确的地方,初步当做个速查表吧. 类的内置函数(继承object的,自己重写) 内置函数 执行时机 注意点 调用案例 __init__ 实例化对象时 不允许写返回值(return None和不返回没区别)子类重写了__init__()方法要在子类中的__init__()方法调用父类的__init__方法(super(当前类, self).__init__(参数)) stu = Student() __new__ 类实例化被调用时 stu = Studetn() _

面向对象的进阶---反射--一些内置方法

反射 反射和一些类的内置方法 1 isinstance ---- issubclass type()--判断 是不是 ininstance(object,cls) 判断 是不是类的对象 如果这个类有父类 这个对象也是这个父类的对象 issubclaaa(cls,cls) 判断一个类是不是另一个类的子类 ============================= 反射 ================================= 把一个字符串 类型的变量 变成一个 真实存在这个程序中的变量名

Python学习【第14篇】:面向对象之反射以及内置方法

面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被

面向对象之反射及内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定

面向对象内置方法

1.isinstance(obj,cls)和issubclass(sub,super) 判断obj是否是cls类的对象 例: li=[1,[2,[3,[4]]]] def run_list(li): for i in li: if isinstance(i,list): run_list(i) else: print(i) run_list(li) 判断sub是否是super的派生类 2. 反射 定义: 通过字符串的形式操作对象的相关属性 相关方法 (1)hasattr print(hasatt

Python之面向对象:类的内置方法

1.def __add__(self,other): c1+c2 两个实例的加法操作就是执行__add__()方法 2.__str__(self): print一个实例的时候,执行的是__str__()这个内置方法 eg: class Vector(object): def __init__(self,a,b): self.a = a self.b = b def __str__(self): return 'Vector(%d,%d)'%(self.a,self.b) def __add__(

python全栈开发【第十七篇】面向对象反射和内置方法

一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定