魔法方法
在python的类里,提供的__xx__的方法,就是魔方方法。魔法方法有很多,这里举三个常用的方法。
1.1__init__()方法
- 如果类里没有定义
__init__
方法,则python会自动创建。 - 为了能够完成自己想要的功能,可以自己定义
__init__
方法 - 不管用户有没有定义
__init__
方法,类里一定有__init__
方法 - 代码举例:
class Person: def __init__(self): self.name = '康康' self.age = 16 self.sex = '男' def walk(self): print("正在走路...") def info(self): print("此人的名字为%s" % self.name) print("此人的年龄为%d" % self.age) print("此人的性别为%s" % self.sex) person = Person() # 实例一个对象 person.info() # 调用实例方法info()即可获取人的属性 person.walk()
1.2带参数的__init__()方法
- 在
__init__(self)
中,默认有一个参数self
,如果在创建对象时传入两个参数时,那么除了self
以外,还得需要两个形参,例如__init__(self, x, y)
- 注意:
- 在内部获取属性和实例方法,通过self获取
- 在外部获取属性和实例方法,通过对象名获取
- 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址
- 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。
- 代码举例:
class Person: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def walk(self): print("正在走路...") def info(self): print("此人的名字为%s" % self.name) print("此人的年龄为%d" % self.age) print("此人的性别为%s" % self.sex) # 实例对象时,参数会传递到__init__()方法里 person1 = Person('康康', 18, '男') person1.info() # 调用实例方法info()即可获取人的属性 person2 = Person('小红', 18, '女') person2.info() # 不同对象的属性值,单独保存 print(id(person1.name)) print(id(person2.name)) # 同一个类的不同对象,实例方法共享 print(id(person1.walk())) print(id(person2.walk()))
1.3__str__()方法
- 说明:
- 当使用print输出对象时,默认打印对象的内存地址,如果类里定义了
__str__()
方法,则会打印从这个方法中return
的数据 __str__
方法通常return
一个字符串,作为这个对象的描述信息
- 当使用print输出对象时,默认打印对象的内存地址,如果类里定义了
- 代码举例:
class Person: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def walk(self): print("正在走路...") def __str__(self): """当print对象时,则打印return的值""" return "此人的名字为%s,此人的年龄为%d,此人的性别为%s" % (self.name, self.age, self.sex) person1 = Person('康康', 18, '男') person2 = Person('小红', 18, '女') # 当类的实例化对象 拥有 __str__ 方法后,那么打印对象则打印 __str__ 的返回值。 print(person1) print(person2)
1.4__del__()方法
- 创建对象后,python解释器会默认创建一个
__init__()
方法 - 当删除对象时,python解释器也会调用一个方法,这个方法是
__del__()
方法 - 代码举例:
class Person: def __init__(self, name): print("__init__方法被调用") self.name = name def __del__(self): print("__del__方法被调用") person1 = Person('康康') del person1 person2 = Person('小红') person2_1 = person2 person2_2 = person2 print("%d 被删除1次" % id(person2)) del person2 print("%d 被删除1次" % id(person2_1)) del person2_1 print("%d 被删除1次" % id(person2_2)) del person2_2
- 总结:
- 当有变量保存了一个对象的引用时,此对象的引用计数就会加1
- 当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)
最后,有喜欢博主写的内容的伙伴可以收藏加关注哦!