类外部添加和获取对象的属性

# 定义类
class Dog(object):
    # 在类中定义的函数,称为方法,函数的所有知识都可以使用
    def play(self): 
        print("小狗正在玩耍.....")


# 创建对象 变量 = 类名()
dog = Dog()  # 类名()创建对象
dog.play()

# 给对象添加属性 对象.属性名 = 值
dog.name = "旺财"
dog.age = 3

# 获取对象的属性 对象.属性名
print(dog.name)
print(dog.age)

# 修改对象的属性 和添加属性一样,存在则修改,不存在则添加
dog.name = "小黑"
print(dog.name)

dog1 = Dog()
dog1.name = "小白"
dog1.age = 2
print(dog1.name)
print(dog1.age

类内部操作属性

class Dog(object): # self 就是一个形参明名字,可以写成其他形参明,一般不修改这个名字,默认是self
    # self 作为类中方法的第一个形参,在通过对象调用方法时,不需要手动传递实参,是python解释器自动调用该方法的对象传递给self,所以self这个形参代表的是一个对象
    def paly(self):
        print(f'self:{id(self)}')
        print(f'{self.name}正在玩耍......')


dog = Dog()
dog.name = '旺财'
print(f'dog:{id(dog)}')
dog.paly()

dog2 = Dog()
dog2.name = '小黑'
print(f'dog2:{id(dog2)}')
dog2.paly()

魔法方法

[!tip|style:flat|label:提示]

在 python 的类中,有一类方法,这类方法以两个下划线开头两个下划线结尾,并且在满足某个特定条件的情况下,会自动调用,这类方法,称为魔法方法

如何学习魔法方法

  1. 魔法方法在什么情况下会自动调用
  2. 这个方法有什么作用
  3. 这个魔法方法有哪些主要事项
# __init__
# 调用时机:在创建对象之后,会立即调用
# 作用:
# 1. 用来给对象添加属性,给对象一个初始值(构造函数)
# 2. 代码的业务需求,每创建一个对象,都需要执行的代码可以写在__init__里面
# 注意点:如果`__init__`方法中,有出了 self 之外的形参,那么在创建的对象的时候,需要给额外的形参传递实参值
# `类名(实参)`

class Dog(object):
    def __init__(self):
        print('我是__init__方法,我被调用了')
        self.name = 'Tom'
        self.age = 18


# 创建一个对象
Dog()
dog = Dog()
print(dog.name)
dog1 = Dog()
print(dog1.name)


# 带参数的__init__方法
class Dog(object):
    def __init__(self, name):
        print('我是__init__方法,我被调用了')
        self.name = name

    def play(self):
      print(f'小狗{self.name}正在快乐的拆家中。。。')


# 创建一个对象
dog = Dog('小白')
print(dog.name)
dog.play()
dog1 = Dog('小黑')
print(dog1.name)
dog1.play()

[!tip|style:flat|label:提示]

__str__

调用时机:

  1. print(对象),会自动调用__str__方法,打印输出的结果是__str__方法的返回值
  2. str(对象)类型转换,将自定义的对象转换成字符串的时候会自动调用

应用:

  1. 打印对象的时候,输出一些属性的信息
  2. 需要将对象转换为字符串类型的时候

主意点:

方法必须返回一个字符串,只有 self 一个参数

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

    def __str__(self):
        return '小狗的名字是:%s,年龄是:%d' % (self.name, self.age)


# 创建一个Dog对象
dog = Dog('旺财', 2)  #
print(dog)  # 没有定义__str__方法之前:print(对象)默认输出对象的内存地址

[!tip|style:flat|label:提示]

析构函数

调用时机:

​ 对象在内存中被销毁删除的时候(引用计数为0)会自动调用 `__del__方法

  1. 程序代码运行结束,在程序运行过程中,创建的所以对象和变量都会被删除销毁
  2. 是用del变量,将这个对象的引用计数为 0 会自动调用 __del__

应用场景

​ 对象删除销毁的时候,要书写的代码可以写在 __del__中一般很少使用

引用计数:是python内存管理的一种机制,是指一块内存,有多少个变量在引用

  1. 当一个变量,引用一块内存的时候,引用计数加 1
  2. 当删除一个变,或者这个变量不在引用这块内存,引用计数减 1
  3. 当内存的引用计数变为 0 的时候,这块内存被删除,内存中的数据被销毁

my_list = [1,2] # 1

my_list1 = my_list #2

del my_list #1

del my_lis1t #0


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

    def __str__(self):
        return '小狗的名字是:%s,年龄是:%d' % (self.name, self.age)

    def __del__(self):
        print(f'{self.name}被销毁了!')


# 创建一个Dog对象
dog = Dog('旺财', 2)
dog1 = dog

print('删除前')
del dog  # dog 变量不能再使用,旺财引用计数 1
print('删除后')
print('删除前')
del dog1 # dog1 变量不能再使用,旺财引用计数 0 ,会立即销毁
print('删除后')

results matching ""

    No results matching ""