面向对象编程(4)双下划线方法

1,__init__

初始化方法,在对象产生后才会执行,不能有返回值

2,__new__方法

类名() 创建对象时,在自动执行 __init()__方法前,会先执行 object.__new__方法,在内存中开辟对象空间并返回

class Person(object):
    def __new__(cls, *args, **kwargs):
        print("__new__方法执行")
        # return object.__new__(cls)

    def __init__(self, name, age):
        print("__init__方法执行")
        self.name = name
        self.age = age


yuan = Person("yuan", 23)
3,__call__

对象加括号,会自动执行call方法

  class Foo(object):
      def __call__(self, *args, **kwargs):
          print("执行call方法")
  
  
  obj = Foo()
  obj()
4,__str__方法
改变对象的字符串显示。可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法
# __str__ 的返回结果可读性强。也就是说,__str__ 的意义是得到便于人们阅读的信息
class Person(object):

    def __init__(self, name, age):
        print("__init__方法执行")
        self.name = name
        self.age = age

    def __str__(self):
        return self.name

yuan = Person("yuan", 23)
print(yuan)
5,__dict__方法

会返回一个字典

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

obj = Foo("alex", 18)
print(obj.__dict__)
6,__repr__方法

在python解释器环境下,会默认显示对象的repr表示。

 # __repr__ 存在的目的在于调试,便于开发者使用
     
 # 案例1:
 class A():
...     def __str__(self):
...         return "str"
... 
...     def __repr__(self):
...         return "repr"
... a = A()
a
repr
print(a)
str
    
# 案例2:
import datetime
date = datetime.datetime.now()
print(str(date))  # '2021-05-21 12:04:02.671735'
print(repr(date)) # 'datetime.datetime(2021, 5, 21, 12, 4, 2, 671735)'
    
# 案例3:
import json
    
dic = {"name":"yuan","age":23}
data = json.dumps(dic)
print(str(data))
print(repr(data))
7,__del__方法

当对象在内存中被释放时,自动触发执行。
在进行垃圾回收时自动触发执行的。

class Person(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __del__(self):
        print("%s删除了" % self.name)


yuan = Person("yuan", 23)
# del yuan
8,__eq__ 方法

拥有__eq__方法的对象支持相等的比较操作

class Person(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, obj):
        return self.name == obj.name


yuan = Person("yuan", 23)
alvin = Person("alvin", 23)
print(yuan == alvin)
9,__len__方法
class G(object):
    def __len__(self):
        return 100

g=G()
print(len(g))
10,__add__方法

对象+值,内部会执行对象的add方法,并将+后面的值当成参数传递进去

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

    def __add__(self, other):
        return "{}-{}".format(self.name, other.name)


v1 = Foo("alex")
v2 = Foo("yuan")

v3 = v1 + v2
print(v3) # alex-yuan
加 __add__
乘 __mul__
·······
posted @ 2021-12-03 18:57  下个ID见  阅读(41)  评论(0)    收藏  举报