Python-面向对象编程-增加属性

117 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

1. 给对象增加属性

在Python中,要给对象设置属性,非常的容易,但是不推荐使用。因为,对象属性的封装应该封装在类的内部。

只需要在类的外部的代码中直接通过对象变量名.属性名设置一个属性即可。

注意:这种方式虽然简单,但是不推荐使用,并没有把对象属性封装在类的内部,只是简单粗暴的给对象添加属性名。

给对象临时增加属性的代码演示如下所示:

class Cat:
    # 定义吃鱼的方法
    def eat(self):
        print("小猫爱吃鱼")

    # 定义喝水的方法
    def drink(self):
        print("小猫要喝水")


# 创建猫对象
tom = Cat()

# 给变量临时增加属性:可以使用 .属性名,利用赋值语句就可以了
tom.name = "Tom"

# 对象调用方法
tom.drink()
tom.eat()

温馨提示:

  1. 在日常开发中,不推荐在类的外部给对象增加属性
  2. 如果在运行时,没有找到属性,程序会报错
  3. 对象包含哪些属性,应该封装在类的内部

2. self的理解

由哪一个对象调用的方法,方法内的self就是哪一个对象的引用

  • 在类封装的方法内部,self就表示当前调用方法的对象自己
  • 调用方法时,程序员不需要传递self参数

在方法内部:

  1. 可以通过self.访问对象的属性
  2. 也可以通过self.调用其他对象方法

代码演示如下所示:代码中使用了self.name访问了name属性。从中可以看出,由哪一个对象调用的方法,方法内的self就是哪一个对象的引用。

class Cat:
    # 定义吃鱼的方法
    def eat(self):
        # 哪一个对象调用的方法,self就是哪一个对象的引用
        print("%s 爱吃鱼" % self.name)

    # 定义喝水的方法
    def drink(self):
        print("%s 要喝水" % self.name)


# 创建猫对象
tom = Cat()

# 给变量临时增加属性:可以使用 .属性名,利用赋值语句就可以了
tom.name = "Tom"

# 对象调用方法
tom.drink()
tom.eat()

# 在创建一个猫对象
lazy_cat = Cat()
lazy_cat.name = "大懒猫"

lazy_cat.drink()
lazy_cat.eat()

# 输出变量
print("tom", tom)
print("lazy-cat", lazy_cat)
# 使用id函数查询数据在内存中的地址
addr = id(tom)
print("以十进制输出:%d" % addr)
print("以十六进制输出:%x" % addr)

程序运行结果如下图所示:tom和lazy_cat对象都调用了eat和drink方法,方法内部的self.name就是由tom和lazy_cat引用。

image.png

3. 初始化方法

当使用类名()创建对象时,会自动执行以下操作:

  1. 为对象在内存中分配空间--创建对象
  2. 为对象的属性设置初始值--初始化方法(init) 上面所说的初始化方法,就是__init__方法,__init__是对象的内置方法

__init__方法是专门用来定义一个类具有哪些属性的方法,使用类名()创建对象的时候,会自动调用初始化方法__init__ 程序演示代码如下所示:

class Cat:
    def __init__(self):
        print("这是一个初始化方法")


# 使用类名()创建对象的时候,会自动调用初始化方法__init__
tom = Cat()

程序运行结果如下图所示:

image.png