查看上一节:类的定义
类的属性和方法
问:为什么实例可以访问到类中的属性和方法?
答:类中定义的属性和方法都是公共的,任何该类实例都可以访问。
属性和方法查找的流程
当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性,如果有,则直接返回当前的对象的属性值;
如果没有,则去当前对象的类对象中去寻找,如果有则返回类对象的属性值,如果没有则报错!
class Person :
name = 'swk'
def say_hello(self) :
print('你好!')
p1 = Person()
p2 = Person()
# 修改p1的name属性
p1.name = 'zbj'
print(p1.name)
print(p2.name)
执行结果为:p1的name是zbj,而p2的name是swk:
此时在内存中的变化:
类对象和实例对象中都可以保存属性(方法)
如果这个属性(方法)是所有的实例共享的,则应该将其保存到类对象中;
如果这个属性(方法)是某个实例独有,则应该保存到实例对象中。
一般情况下,属性保存到实例对象中,而方法保存到类对象中。
设置新需求:say_hello()可以打印:“你好!我是 xxx”
上面讲过:方法每次被调用时,解析器都会自动传递第一个实参,其实第一个参数,就是调用方法的对象本身。示例代码和注释如下:
class Person :
name = 'swk'
def say_hello(self) :
# 如果是p1调的,则第一个参数就是p1对象
# 如果是p2调的,则第一个参数就是p2对象
# 一般我们都会将这个参数命名为self
'''
say_hello()这个方法,可以显示如下格式的数据:
你好!我是 xxx
注意:在方法中不能直接访问类中的属性,此处只写name是会报错的,所以要通过`self.name`的形式:
'''
print('你好!我是 %s' %self.name)
# 创建Person的实例
p1 = Person()
p2 = Person()
# 修改p1的name属性
p1.name = '猪八戒'
p2.name = '沙和尚'
p1.say_hello() # '你好!我是 猪八戒'
p2.say_hello() # '你好!我是 沙和尚'
执行结果为:
这就完成了上述需求!
点击查看配套视频教程
获取更多内容请订阅Python学习站官方技术圈!