Discuss / Python / 调用实例的瞬间就已经将实例固定下来了,后续重新class也不会改变实例

调用实例的瞬间就已经将实例固定下来了,后续重新class也不会改变实例

Topic source

尝试下来,发现一个问题调用实例的瞬间相当于把程序固定了,后续重新定义class不会影响重新定义的程序,通过print 可以对比得到不同的物理地址

比如,

#第一轮
class  Student(object):
	def __init__(self, name, score):
		self.name = name
		self.score = score
    def print_score(self):
        print('%s: %s' % (self.name, self.score))
#实例1
lisa = Student('Lisa',99)
#第二轮
class  Student(object):
	def __init__(self, name, score):
		self.name = name
		self.score = score
	def get_grade(self):
		if self.score >= 90:
		    return 'A'
		elif self.score >= 60:
		    return 'B'
		else:
		    return 'C'
	def print_score(self):
		print ('%s: %s, Level %s' % (self.name, self.score,self.get_grade()))

#创建实例2
bart = Student('Bart',58)

#调用函数输出
lisa.print_score()
bart.print_score()

##结果
#Lisa: 99  
#Bart: 58, Level C


HIPPO176

#2 Created at ... [Delete] [Delete and Lock User]

可以理解为向上调用?!

孤o赦免你

#3 Created at ... [Delete] [Delete and Lock User]

实例化本身就是要载入内存的当然不一样了

沧海奇迹1

#4 Created at ... [Delete] [Delete and Lock User]
lisa = Student('Lisa',99)
这行代码在运行的时候创建了一个实例,
后面的代码重新定义Studengt类的时候,lisa实例并没有被改变
所以lisa和你后面的代码没有任何 关系

以你的源码为标准,在你创建实例 例如lisa = Student('Lisa',99),输出lisa.print_score()的格式取决于你最近一次创建的 类的方法;或者说你最后再创建一个实例,那么它的输出格式一定套用的是下面那个模板,很容易验证,大家不妨多试几次

我开始理解的就是向上调用

LZY教主

#7 Created at ... [Delete] [Delete and Lock User]

我觉得按变量绑定对象的知识来理解可能比较好

按python万物皆对象的特点,Class也是个对象,你第一个lisa实例不是Student这个Class name的实例,而是Student这个Class name所指向的Class object的实例(这里记为Class object1)

而第二次定义Student类,并不是修改了Class object1,而是创建了新的Class object2,并把Class name重新指向了Class object2。所以bart严格来说同样也不是Student的实例,而是它指向的Class object2的实例。

这时Class object1还在不?在啊,只是没法用Student访问了而已!所以lisa至始至终都是Class object1的实例。其实逻辑就和a = 1;b = a;a = 2是一样的,你说b等于1还是2?


  • 1

Reply