菜比之路

走菜比的路,让大牛说去吧
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

【python】类的特殊成员方法<1>

Posted on 2020-02-17 21:48  毕加索的ma  阅读(184)  评论(0编辑  收藏  举报

1.__doc__ :打印类的描述信息

class Foo:
    """ 描述类信息,这是用于看片的神奇 """

    def func(self):
        pass


print(Foo.__doc__)
#>>>描述类信息,这是用于看片的神奇 

2.__module__:表示当前操作的对象在那个模块

"""
mymodule
"""
class C:

    def __init__(self):
        self.name = 'paul'

"""
-------
"""
from mymodule.lib import C

obj = C()
print (obj.__module__)  # 输出 lib.aa,即:输出模块
#>>>>mymodule.lib

3.__class__表示当前操作的对象的类是什么

"""
mymodule
"""
class C:

    def __init__(self):
        self.name = 'paul'

"""
-------
"""
from mymodule.lib import C

obj = C()
print (obj.__class__)     # 输出 lib.aa.C,即:输出类
#>>><class 'mymodule.lib.C'>

4. __init__ :构造方法,通过类创建对象时,自动触发执行

class Role(object):    
#初始化函数,在生成一个角色时要    初始化的一些属性就填写在这里    
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        
#__init__中的第一个参数self,和这里的self都 是什么意思? 看下面解释
self.name = name
        self.role = role

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

class Role(object):
    def __init__(self,name,role,weapon:
        self.name = name
        self.role = role
        self.weapon = weapon

    def __del__(self):             #析构函数
        print("del.....run...")
r1 = Role('Alex','police','AK47')    #生成一个角色

6.__call__:对象后面加括号,触发执行

class Foo:

    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 __init__
obj()  # 执行 __call__
#>>>__call__
class ClassA(object):
    def __new__(cls, *args, **kwargs):
        object = super(ClassA, cls).__new__(cls)
        print("HHHA:0===>")
        return object

    def __init__(self, *args, **kwargs):
        print("HHHB:0===>")

    def __call__(self, func):
        print("HHHC:0===>")
        return func


A = ClassA()
print("HHHH:0====>")
@ClassA()
def hello():
    print("HHHC:0===>hello")
print("HHHH:1====>")
hello()

#>>>HHHA:0===>
#>>>HHHB:0===>
#>>>HHHH:0====>
#>>>HHHA:0===>
#>>>HHHB:0===>
#>>>HHHC:0===>
#>>>HHHH:1====>
#>>>HHHC:0===>hello

  

7.__dict__:查看类或对象中的所有成员

print(类.__dict__) # 打印类里所有属性,不包括实例属性
print(实例.__dict__) #打印实例所有属性,不包括类属性

8.__str__:如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值

class Foo:

    def __str__(self):
        return 'paul'


obj = Foo()
print(obj)
#>>>paul

9.__getitem____setitem____delitem__:

注:用于索引操作,如字典。以上分别表示获取、设置、删除数据

class Foo(object):

    def __getitem__(self, key):
        print('__getitem__', key)

    def __setitem__(self, key, value):
        print('__setitem__', key, value)

    def __delitem__(self, key):
        print('__delitem__', key)


obj = Foo()

result = obj['k1']  # 自动触发执行 __getitem__
#>>>__getitem__ k1
obj['k2'] = 'alex'  # 自动触发执行 __setitem__
#>>>__setitem__ k2 alex
del obj['k1']   
#>>>__delitem__ k1

10.类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__

 11.__len__,使用 len(object) 触发

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

    def __len__(self):
        return 10    # 注意返回结果必须是 int 类型


f = Foo('hkey')
print(len(f))
#>>>10

12.__hash__,调用 hash(object) 触发

class Foo:
    def __init__(self):
        self.a = 1
        self.b = 5

    def __hash__(self):
        return hash(str(self.a) + str(self.b))


f = Foo()
print(hash(f))
#>>>-3542141893081931293

13.__eq__,当两个对象进行比较时,触发

class Foo:
    def __init__(self):
        self.a = 1
        self.b = 5

    def __eq__(self, other):
        if self.a == other.a and self.b == other.b:
            return True
        return False

a = Foo()
b = Foo()
print(a == b)   # 执行这个比较的时候,就调用了 __eq__ 方法
#>>>True