习题42:
class:python自动将函数放到字典里,创建更棒的函数字典。目前将其当作高级的函数字典就行。
这几个差不多都是同样的问题。
为什么是self:只有在类中有,区别于函数。这个不需自行赋值的参数指代的是实例对象本身而不是类本身,
否则多个实例对象时self就不知道指向哪一个了???(其实不是很懂这句话)
代表当前对象的地址,能避免非限定调用造成的全局变量(这句话或许意思是通过self使得class内的这个函数不被直接调用?)
MyObject.method(arg1,arg2)>>>Myclass.method(MyObject,arg1,arg2)
字典、模组、对象和类(对于理解这次的程序很有用)
实例化的过程相当于你创建了这么一个迷你模块,包含这些函数属性,而且同时 import 了它
怎样创建class:创建对象时,调用_init_来对空对象进行初始化
class xxx(object):
def __init__(self):#一定要记得左右都是两个下划线,否则显示object()takes no parameters
pass
def other_function(self):
pass
*(还得留个坑)getattr(object,name)和object.name是一样的功能.只不过可以把name作为一个变量去处理
为什么不用object.name而有的时候一定要用getattr(object,name),
主要是由于这里的name有可能是变量,我们不知道这个name到底是什么,
如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;
调用的话就是函数对象后面加括号,如func之于func();
根据属性名称返回对象值
self.start=start
next=self.start
while True:
room=getattr(self,next)
next=room()
我先把getattr部分换为了next
报错,显示 'str' object is not callable,因为其他地方未设置room字典。
此时赋值后的room实际上为"central_corridor",就无法调用了。
所以getattr一定是使room获得了一个函数名。
hasattr()、getattr()、setattr()函数
如果给定的方法是实例方法,则不能写getattr(A, 'func')(),因为fun()是实例对象的话,
是不能用A类对象来调用的,应该写成getattr(A(), 'func')();(不懂!!!,看傻了,先跳过吧)
*重写程序,分成两个类、
又出现了'engine' object has no attribute 'central_corridor'
现在还不知道哪里出了问题。ex42.3.py