self的使用 | 手把手教你入门Python之五十二-阿里云开发者社区

开发者社区> 温柔的养猫人> 正文

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

配套视频

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
clickhouse的使用和技巧,仅个人
centos 安装clickhouse   curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.
4820 0
Python魔法方法的使用 | 手把手教你入门Python之五十三
Python ⾥有⼀种⽅法,叫做魔法⽅法。Python 的类⾥提供的,两个下划线开始,两个下划线结束的⽅法,就是魔法⽅法,魔法⽅法在恰当的时候就会被激活,⾃动执⾏。
1038 0
使用容器编排工具docker swarm安装clickhouse多机集群
1.首先需要安装docker最新版,docker 目前自带swarm容器编排工具 2.选中一台机器作为master,执行命令sudo docker  swarm init [options] 3,再需要加入集群的集群上执行此命令   4.
3209 0
HaaS轻应用(Python):手把手带你玩转mqtt
HaaS轻应用(Python):手把手带你玩转mqtt
91 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12078 0
self的使用 | 手把手教你入门Python之五十二
通过 self.属性名 可以访问到这个对象的属性;通过 self.方法名() 可以调用这个对象的方法。
967 0
蚂蚁集团自研数据库 OceanBase 在中华财险业务系统投入使用
中华财险车险系统已经在全国 29 省成功上线蚂蚁集团自研数据库 OceanBase。
362 0
1172
文章
2
问答
来源圈子
更多
Python学习资料大全,包含Python编程学习、实战案例分享、开发者必知词条等内容。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载