上一篇:初识面向对象 | 手把手教你入门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()
执行结果:
给对象添加属性
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
执行结果:
这种方法很方便,但是,不建议使用这种方式给对象添加属性。
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
的执行结果:
添加之后执行结果: