self的使用 | 手把手教你入门Python之五十二

简介: 通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。

上一篇:初识面向对象 | 手把手教你入门Python之五十一
下一篇:Python魔法方法的简介 | 手把手教你入门Python之五十三

本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。

self的使用

class Student(object):
    def __init__(self, x, y):
        self.name = x
        self.age = y

    def say_hello(self):
        print('大家好,我是', self.name)  

# Student('张三', 18)这段代码具体做了什么呢?
# 1.调用__new__方法,用来申请内存空间
# 2.调用__init__方法,将self指向创建好的内存空间,填充数据
# 3.变量s1也指向创建好的内存空间 
s1 = Student('张三', 18)
# print('0x%x' % id(s1))
# print('s1的名字是', s1.name)
# s1.say_hello()

s2 = Student('jack', 21)
s2.say_hello()

执行结果:
image.png
image.png

给对象添加属性

python支持动态属性,当一个对象创建好了以后,直接使用 对象.属性名 = 属性值 就可以很方便的给对象添加一个属性。

tom = Cat()
tom.name = 'Tom' # 可以直接给 tom 对象添加一个 name 属性

或者利用上面Student类来说明:

class Student(object):
    def __init__(self, x, y):
        self.name = x
        self.age = y

    def say_hello(self):
        print('大家好,我是', self.name)  

# Student('张三', 18)这段代码具体做了什么呢?
# 1.调用__new__方法,用来申请内存空间
# 2.调用__init__方法,将self指向创建好的内存空间,填充数据
# 3.变量s1也指向创建好的内存空间 
s = Student('张三', 18)


print(s.name)
s.say_hello()

# 没有属性,会报错 AttributeError
# print(s.height)

# 直接使用等号给一个属性赋值
# 如果这个属性以前不存在,会给对象添加一个新的属性
# 动态属性
s.city = '上海' # 给对象添加了一个属性city
print(s.city)

# 如果这个属性以前存在,会修改这个属性对应的值
s.name = 'jack'
print(s.name) # jack

执行结果:
image.png

这种方法很方便,但是,不建议使用这种方式给对象添加属性。

self的概念

哪个对象调用了方法,方法里的self 指的就是谁。 通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。

class Cat:
    def eat(self):
        print("%s爱吃鱼" %self.name)

tom = Cat()
tom.name = 'Tom' # 给 tom 对象添加了一个name属性
tom.eat() # Tom爱吃鱼

lazy_cat = Cat()
lazy_cat.name = "大懒猫"
lazy_cat.eat() # 大懒猫爱吃鱼

直接给对象添加属性的缺点

上述代码中,我们是先创建对象,然后再给对象添加 name 属性,但是这样做会有问题。

tom = Cat()
tom.eat()
tom.name = "Tom"

程序运行时会报错:

AttributeError: 'Cat' object has no attribute 'name'
错误提示:'Cat'对象没有 'name' 属性

在日常开发中,不推荐在类的外部直接给对象添加属性这种方式。对象应该具有哪些属性,我们应该封装在类的内部。

__slots__属性的使用

    # 这个属性值直接定义在类里,是一个元组,用来规定对象可以存在的属性
    __slots__ = ('name', 'age', 'city')

不添加city的执行结果:
image.png
添加之后执行结果:
image.png

配套视频

相关文章
|
28天前
|
Java Python 开发者
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
线程池详解与异步任务编排使用案例-xian-cheng-chi-xiang-jie-yu-yi-bu-ren-wu-bian-pai-shi-yong-an-li
77 2
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
|
1天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
1天前
|
存储 索引 Python
Python从入门到精通——1.3.1练习编写简单程序
Python从入门到精通——1.3.1练习编写简单程序
|
1天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
1天前
|
数据采集 数据可视化 数据处理
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
Python从入门到精通的文章3.3.1 深入学习Python库和框架:数据处理与可视化的利器
|
1天前
|
Java 数据库连接 数据处理
Python从入门到精通:3.1.2多线程与多进程编程
Python从入门到精通:3.1.2多线程与多进程编程
|
1天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
6天前
|
机器学习/深度学习 数据可视化 数据挖掘
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
《Python 简易速速上手小册》第9章:数据科学和机器学习入门(2024 最新版)
19 1
|
6天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
35 0
|
8天前
|
机器学习/深度学习 数据采集 算法
scikit-learn入门指南:从基础到实践
【4月更文挑战第17天】这篇指南介绍了scikit-learn,一个Python数据分析和机器学习的重要库。内容涵盖安装、数据加载与预处理、模型训练(如KNN分类器)、评估、调参优化及高级应用,如降维和聚类。通过实例展示了scikit-learn在分类任务中的使用,强调其在数据科学中的重要性。要深入了解,可参考官方文档和实践案例。

热门文章

最新文章