属性和方法 | Python从入门到精通:高阶篇之二十三

查看上一节:类的定义

类的属性和方法

问:为什么实例可以访问到类中的属性和方法?
答:类中定义的属性和方法都是公共的,任何该类实例都可以访问。

属性和方法查找的流程

当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性,如果有,则直接返回当前的对象的属性值;

如果没有,则去当前对象的类对象中去寻找,如果有则返回类对象的属性值,如果没有则报错!

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:
属性和方法 | Python从入门到精通:高阶篇之二十三
此时在内存中的变化:
属性和方法 | Python从入门到精通:高阶篇之二十三

类对象和实例对象中都可以保存属性(方法)

如果这个属性(方法)是所有的实例共享的,则应该将其保存到类对象中;
如果这个属性(方法)是某个实例独有,则应该保存到实例对象中。
一般情况下,属性保存到实例对象中,而方法保存到类对象中。

设置新需求: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从入门到精通:高阶篇之二十三
这就完成了上述需求!

点击查看配套视频教程

获取更多内容请订阅Python学习站官方技术圈!

上一篇:7篇文章搞懂Python的类与对象


下一篇:算法笔试模拟题精解之“木棒拼接”