笨方法学python 习题42(对外星人游戏的改写。改错了还不知道为什么,getattr也要再看)

习题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




    












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值