python入门与进阶(9-9)

2018-05-04  本文已影响32人  buaishengqi

9-9 在实例方法中访问实例变量与类变量
看一看思维导图


Python类.png

问题如下,在实例方法的内部(强调在实例方法的内部)可以访问类变量吗?如果可以访问,那么访问的方式是什么?

class Student():
    sum = 0
    name = '小鱼'
    age = 0 


# 实例方法  定义实例方法的时候必须加上self
    def __init__(self,name,age): #构造函数的意义是初始化类的特征的
        #构造函数可以看做是一个特殊的实例方法。和普通的实例方法几乎是一样的
        #最大的不同是,调用的方式的不同
        self.name = name 
        self.age = age           
        print(self.name) #实例方法里操作实例变量
        
    def do_homework(self):#实例方法是描述类的行为的
        print('homework')
     
student1 = Student('石敢当',18) #调用构造函数是通过类后面加上括号的方式来调用的
student1.do_homework()#调用普通函数的是通过实例对象后面加点
print(student1.name)
print(student2.name) 
print(Student.name) 

# 来看一个经典的例子(容易犯错的,反面教材)

class Student():
    sum = 0
    name = '小鱼'
    age = 0 
    def __init__(self,name,age): 
        
        self.name = name 
        self.age = age           
        print(self.name) #看看这个打印结果  有不一样的吗?
        print(name) #看看这个打印结果  有不一样的吗?打印结果如图1,都是一样的,为什么?
        
    def do_homework(self):
        print('homework')
     
student1 = Student('石敢当',18)

#当我们把形参列表中的name改成name1 看看结果是什么?如图2
class Student():
    sum = 0
    name = '小鱼'
    age = 0 
    def __init__(self,name1,age): 
        
        self.name = name1
        self.age = age           
        print(self.name) 
        print(name) 
        
    def do_homework(self):
        print('homework')
     
student1 = Student('石敢当',18)
# 为什么出现图2的错误?
# 因为self.name 读取的是实例变量,而print(name)读取的是形参列表,所以造成了假象,打印了两个一样的结果
# 所以加上self很有必要


# 如何在实例方法中访问类变量?
class Student():
    sum = 0  #sum是内置函数
    name = '小鱼'
    age = 0 
    def __init__(self,name,age): 
        
        self.name = name
        self.age = age           
        print(sum)   #在实例方法中访问类变量看图3打印结果
        
        
    def do_homework(self):
        print('homework')
     
student1 = Student('石敢当',18)

# 在看一个例子
class Student():
    sum1 = 0   #不是内置函数
    name = '小鱼'
    age = 0 
    def __init__(self,name,age): 
        
        self.name = name
        self.age = age           
        print(sum1)   #在实例方法中访问类变量看图4打印结果
        
        
    def do_homework(self):
        print('homework')
     
student1 = Student('石敢当',18)
# 上述的两个例子说明千万不要妄图在实例方法的内部通过不加self直接访问实例变量
# 也不要想着不加前缀来访问类变量


# 来看看正确的在实例方法中访问类变量的两种方式 如图5所示
class Student():
    sum1 = 0  
    name = '小鱼'
    age = 0 
    def __init__(self,name,age): 
        
        self.name = name
        self.age = age           
        print(Student.sum1)   #在内部的使用
        
        
    def do_homework(self):
        print('homework')
     
student1 = Student('石敢当',18)
print(student1.name)
print(Student.sum1)  #通过大写类名加点号在加变量名,这是在外部的使用!在内部同样可以!


# 第二种方式
class Student():
    sum1 = 0  
    name = '小鱼'
    age = 0 
    def __init__(self,name,age): 
        
        self.name = name
        self.age = age           
        print(self.__class__.sum1)   #这种方法也可以
        
        
    def do_homework(self):
        print('homework')
     
student1 = Student('石敢当',18)
print(student1.name)
print(Student.sum1)  
1.jpg 2.jpg 3.jpg 4.jpg 5.jpg
上一篇 下一篇

猜你喜欢

热点阅读