几个类的内置方法

Posted whylinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几个类的内置方法相关的知识,希望对你有一定的参考价值。

# 类的内置方法

# 双下方法
    # __str__
        # 当类中定义了__str__方法后,print(这个类对象时),会调用__str__. 或者格式化%s输出对象时,都会触发__str__
    # __repr__
        # 当类中定义了__repr__方法后,print(repr(a)),就会调用a对象中的__repr__()方法。格式化输出用%r时同样会调用__repr__
        # 同样对象中如果没有定义__repr__方法,那么就会调用父类中的__repr__
    # __repr__是__str__的备胎,str不能做repr的备胎,当类内部没有定义str时,想要调用类的str方法,则会调用repr方法
    # 如果没有__str__方法,会先找本类中的__repr__方法,如果还没有找到再从父类中的__str__找,没有再找__repr,但object基类肯定定义了这两个方法
    # repr(),只会找__repr__,如果没有__repr__则会找父类的__repr__

    # object里有一个__str__,一旦被调用,就返回调用对象的内存地址
    # print(对象) # 打印一个对象的时候,就是调用对象.__str__,如果对象中没有定义__str__方法,则会调用基类object中的__str__,就会打印对象的内存地址

class A:
    def __init__(self, name):
        self.name = name
    def __str__(self):  # 此类定义的对象,被格式化%s输出或者print打印时或print(str(obj))会触发此方法
        return A
    def __repr__(self): # 此类定义的对象,被格式化%r输出或者print打印时或print(repr(obj)),会触发此方法
        return str(self.__dict__)

a = A(why)
print(a)    # A 如果没有定义__str__方法,则会调用父类object的__str__
print(str(a))   # A  如果没有定义__str__方法,则会调用父类object的__str__
print(%s : %s % (A, a)) # A : A     # 格式化输出对象a,也会调用a的__str__

print(repr(a))  # {‘name‘: ‘why‘}
print(%r % a) # {‘name‘: ‘why‘}



# 析构函数 __del__
class A:
    def  __init__(self):
        self.name = why

    def __del__(self):
        print(执行我了)

a = A()
del a   # 调用此方法后,先执行析构函数__del__方法,之后删除了这个对象.如果自己没有删除,在程序运行结束后,解释器会进行析构删除


# __call__
    # 一个对象obj,如果obj()就会调用__call__方法
class A:
    def __init__(self):
        self.name = why

    def __call__(self):
        print(执行我了)

a = A() #
a() # 执行我了      # 调用了对象__call__方法

 

# __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)

    def __delattr__(self, item):
        print(del obj.key 时,我执行)
        self.__dict__.pop(item)

f1 = Foo(sb)
f1[age] = 18  # 调用了类的__setitem__方法,增加了一个属性age,值为18
f1[age1] = 19 # 实际调用了__setitem__方法
print(f1[age1])   # 19    # 实际调用了__getitem__方法
del f1.age1     # 3 del obj.key 时,我执行
del f1[age]   # del obj[key]时, 我执行

 

# __new__
class A:
    def __init__(self):
        self.x = 1
        print(in init function)

    def __new__(cls, *args, **kwargs):  # 此方法才是实例化时,先被调用的方法,此方法造出了self,一般我们不用实现
        print(in new function)
        return object.__new__(A, *args, **kwargs)

a = A() # in new function
        # in init function

 

以上是关于几个类的内置方法的主要内容,如果未能解决你的问题,请参考以下文章

java几个类的简单使用

内置锁synchronized的几个要注意的对象监视器

Python入门之面向对象编程python类的详解

026 面向对象05——封装

Java容器结构总结 ---讲了很多类的大致关联和继承关系 粗略讲了几个类

具有共享类的引用 DLL