python学习之路 12 - python面向对象(二)

魔法方法

在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一个字符串,作为这个对象的描述信息
  • 代码举例:
    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的时候,则对象才会被真正删除(内存被回收)

最后,有喜欢博主写的内容的伙伴可以收藏加关注哦!

猜你喜欢

转载自blog.csdn.net/weixin_44604586/article/details/106728996
今日推荐