Python之类变量与实例变量同名时的解决办法

举例

类变量与实例变量同名,此时使用实例对象去调用类变量,我们看看会发生什么?

class MyDemo(object):
    my_girl_friend = "大美女"

    def __init__(self):
        self.my_girl_friend = "丑女"

temp = MyDemo()
print(temp.my_girl_friend)

输出:

丑女

输出的是实例变量的值,那怎么办才能输出大美女????往下看!

 

原因

a、当你使用实例对象去访问一个属性时(Python术语常称属性),会先从实例对象的命名空间里寻找这个属性,若当前的对象有这个属性,就会返回这个属性的值!

b、如果在实例对象的命名空间里没有找到该属性,则会再去类对象的命名空间中寻找是否有该属性,若找到了就返回这个属性的值

c、当在实例对象的命名空间找不到该属性,也在类对象的命名空间里找不到该属性,那么此时就会抛出一个异常

抛出异常的情况

class MyDemo(object):
    my_girl_friend = "大美女"

    def __init__(self):
        self.my_girl_friend = "丑女"

temp = MyDemo()
print(temp.my_girl_friend)

输出:

Traceback (most recent call last):
  File "/Users/xx/Downloads/gitCloneLiveMeAutoTest/LiveMeAPITest/temp/temp.py", line 8, in 
    print(temp.fk)
AttributeError: 'MyDemo' object has no attribute 'fk'

明确告知,MyDemo这个对象是没有fk属性!

 

引申知识:类变量的两种访问方式

1、使用类名

2、使用实例对象名

 

怎么才能得到大美女?

改一行代码即可,使用类名的方式去访问类变量即可,此时一定会得到大美女,因为明确告诉解释器,我要访问的是类对象的属性!

print(MyDemo.my_girl_friend)

输出:

大美女

 

Python中的一切都是对象,属性知识点再回忆

1、类变量,是类对象的属性

2、实例变量,是实例对象的属性

3、局部变量,是函数对象或方法对象的属性

4、全局变量,是模块对象的属性

 

写在最后

1、一方面要编写代码时,绝对不要出现类变量与实例变量同名的情况

2、另一个方面则是养成好习惯,使用类名.xxx的方式去访问类变量

你可能感兴趣的:(Python,综合)