我在问自己Python3.6是否有类的默认构造函数。所以我写了一些代码来测试这个。但我留下的问题比我开始测试这个的时候要多。在
我试图理解为什么myCat在我程序的第11行构建ok,但我无法解释为什么我的程序的第27行要求知道它自己
如果可以的话,请检查一下这个Python代码和输出。。。有道理吗? 我做了两个文件动物.py还有一个测试_程序.py. 在
#!/usr/bin/env python3
#animal.py file ==============================
class animal:
name = ""
height = 0
weight = 0
def __init__( self, name, height, weight):
self.name = name
self.height = height
self.weight = weight
def printvars(self):
print(self.name)
print(self.height)
print(self.weight)
#!/usr/bin/env python3
#an_animal_program.py ==============================
import animal as an
#Instantiate a variable of type animal using the special constructor of the class
myDog = an.animal('Capitan', 30, 70)
print('myDog\'s name is ' + myDog.name)
myDog.printvars()
#now play around with Python and discover some things...
#Instantiate a variable of type animal without using the special constructor
myCat = an.animal
print('myCat\'s name is ' + myCat.name)
print('myCat\'s height is ' + "%d" % (myCat.height))
print('myCat\'s weight is ' + "%d" % (myCat.weight))
#notice everything in myCat is empty or zero
#thats because myCat is not initialized with data
#none-the-less myCat is a viable object, otherwise Python would puke out myCat
myCat.name = 'Backstreet'
print('myCat\'s name is ' + myCat.name) # now myCat.name has data in it
#Ouch... this next line produces an error:
#myCat.printvars()
#"an_test_program.py", line 21, in <module>
# myCat.printvars()
#TypeError: printvars() missing 1 required positional argument: 'self'
myCat.printvars(myCat) #ok, I'm rolling with it, but this is wierd !!!
#oh well, enough of the wierdness, see if the myCat var can be
#reinstantiated with an animal class that is correctly constructed
myCat = an.animal('Backstreet', 7, 5)
myCat.printvars()
#I'm trying to understand why myCat constructed ok on line 11
#But I can't explain why line 27 demanded to know itself
#the output is:
# RESTART: an_test_program.py
#myDog's name is Capitan
#Capitan
#30
#70
#myCat's name is
#myCat's height is 0
#myCat's weight is 0
#myCat's name is Backstreet
#Backstreet
#0
#0
#Backstreet
#7
#5
你什么都没做。您只创建了对
animal
类的另一个引用。该类已经具有}属性,因此
name
、height
和{print()
语句可以访问这些属性并打印值。您也可以给这些类属性一个不同的值,这样myCat.name = 'Backstreet'
也可以工作。但是,通过animal.name
也可以看到这种变化。myCat.printvars
是对您定义的方法的引用,但它是未绑定的;这里没有实例,只有一个类对象,因此没有设置self
的内容。在这种情况下,您可以显式地为self
传递一个值,这就是myCat.printvars(myCat)
起作用的原因;您显式地将self
设置为myCat
,同样,该类对象具有使其工作所需的属性。。您仍然可以从
myCat
引用创建实际实例:请记住,Python中的所有名称都是引用;通过指定以下内容,可以始终对对象进行更多引用:
^{pr2}$现在}也指向
foo
和{animal
类。相关问题 更多 >
编程相关推荐