python的self.boardx -= 5 什么意思_python里的self是什麼意思

其实我是自己很想回答这个问题,可惜别人的问题closed了,只好自问自答。self指的是this,但更重要的是,摆在function宣告里的self又作何解释呢?就是把该function宣告为物件函数的意...

其实我是自己很想回答这个问题,可惜别人的问题closed 了,只好自问自答。

self 指的是 this,

但更重要的是,摆在 function 宣告里的 self 又作何解释呢?

就是把该 function 宣告为 物件函数 的意思,

如果,function 的参数中没有 self ,那就是静态函数(或称类别函数),

可直接透过类别名呼叫,但,例如,class A 中的 函数 f1,呼叫方式即为 A.f1,

但,要注意的是,类别函数内,无法使用 物件变数,

如果硬要的话,可以在类别函数的参数内多加一个型别为A 的参数,

这是在你不想用 self,但又要一定要用成员变数时,的变通方式。相当於放屁时,不想屁弄到裤子,

简单说明一下,我对 成员函数 的小小感想,

事实上,一开始,函数就像 C 里头的函数一样单纯自然的,

怎麼说单纯自然呢?看到几个参数就是几个参数,

你可以想像,编译器在分配储存空间时,编译一个有三个int 参数并传回int的函数时,会保留四个4 bytes的空间(也就是 16 bytes),分别让函数被呼叫时,可以接收三个int ,而在函数执行完时,会将会传回的 int,写到 第4个 int 上(理论上应该是第一个,无所谓啦),

到了,物件导向的程式语言里,基本上,类别函数也是这个样子处理的,所以,没学过物件导向的人,或觉得物件导向麻烦的人,但又一定要用物件导向程式语言时,就通通用 类别函数就好,只有一点小麻烦,每个函数除了它的名字,还有 它的 "姓" (就是它 所属类别 的名字),要记得加上去。(事实上,这样很方便管理 函数,要知道,当你程式写多了,写大了,最麻烦的事,就是 取名字,有类别名,就能重覆用名字了)

再说回,物件函数,当初设计 物件导向程式语言 的人,弄了个花招,他想说要让用的人感受到这种程式语言 的"亮点" ,所以,帮这种 函数 偷偷的在暗地里多加了一个 参数,叫做 this (或者你要说 self 也行),简单的说,如果一个 三个 int 参数 并回传 int 的函数,呼叫它的储存空间,就会变成 20 bytes(以32位元程式来说), 其中,一样是 12 bytes 给 传入参数,4bytes 给回传用,另外多了 4 bytes,则是用来传入一个参考位址(或者说是一个 pointer),指向 某个 本类别的物件,

还记得吗?类别只是收录在编译器的脚本,告诉编译器初始一个该类变数或说是物件时,要给几个bytes,还有各成员变数的 偏移位址 多少,各函数呼叫位址多少等等的,所以,类别内宣告的变数,基本上在程式执行时,是不存在於记忆体,只有当 程式里 有该类变数 被初始化时,才会配置实体记忆体空间。

既然,类别是不存在的虚拟范本,它就无法叫用 物件函数,只有透过物件初始化,得到实体记忆体空间配置的物件,因为具有 实体位址,因此,可以呼叫物件函数,而呼叫时,它的位址就会被填到那个 this (或 self)的参数里,大部份的物件导向程式语言都隐藏了这个参数, python 只是把它突显出来给你看,但相对来讲,你不用对 类别函数 宣告 static 。

这样不晓得解释的OK 不OK耶!

由於,我才刚始用 python(两个礼拜前吧),如果说的有问题,请大家指正,感谢!

展开

def __init__(self,monster_name,pos,groups,obstacle_sprites,damage_player,trigger_death_particles,add_exp): # general setup super().__init__(groups) self.sprite_type = 'enemy' # graphics setup self.import_graphics(monster_name) self.status = 'idle' self.image = self.animations[self.status][self.frame_index] # movement self.rect = self.image.get_rect(topleft = pos) self.hitbox = self.rect.inflate(0,-10) self.obstacle_sprites = obstacle_sprites # stats self.monster_name = monster_name monster_info = monster_data[self.monster_name] self.health = monster_info['health'] self.exp = monster_info['exp'] self.speed = monster_info['speed'] self.attack_damage = monster_info['damage'] self.resistance = monster_info['resistance'] self.attack_radius = monster_info['attack_radius'] self.notice_radius = monster_info['notice_radius'] self.attack_type = monster_info['attack_type'] # player interaction self.can_attack = True self.attack_time = None self.attack_cooldown = 400 self.damage_player = damage_player self.trigger_death_particles = trigger_death_particles self.add_exp = add_exp # invincibility timer self.vulnerable = True self.hit_time = None self.invincibility_duration = 300 # sounds self.death_sound = pygame.mixer.Sound('../audio/death.wav') self.hit_sound = pygame.mixer.Sound('../audio/hit.wav') self.attack_sound = pygame.mixer.Sound(monster_info['attack_sound']) self.death_sound.set_volume(0.6) self.hit_sound.set_volume(0.6) self.attack_sound.set_volume(0.6)详细注释这段代码
最新发布
06-03
这是一个 Python 类的初始化函数,用于创建敌人对象。下面是对该代码的详细注释: ```python def __init__(self, monster_name, pos, groups, obstacle_sprites, damage_player, trigger_death_particles, add_exp): ``` - `def` 表示这是一个函数定义。 - `__init__` 是 Python 中的特殊函数,用于初始化对象。 - `self` 关键字代表对象本身。 - `monster_name` 是敌人的名称。 - `pos` 是敌人在游戏中的初始位置。 - `groups` 是敌人所属的精灵组。 - `obstacle_sprites` 是敌人所遇到的障碍物精灵组。 - `damage_player` 是敌人攻击玩家造成的伤害值。 - `trigger_death_particles` 是敌人死亡时触发的粒子效果。 - `add_exp` 是敌人死亡时玩家获得的经验值。 ```python super().__init__(groups) ``` - `super()` 是调用父类的方法。 - `__init__` 表示调用父类的初始化函数。 - `groups` 是参数,传入精灵组。 ```python self.sprite_type = 'enemy' ``` - `self` 代表对象本身。 - `sprite_type` 是敌人的类型。 - `'enemy'` 是字符串类型,代表敌人是一种敌对单位。 ```python self.import_graphics(monster_name) ``` - `self` 代表对象本身。 - `import_graphics` 是一个方法名,用于导入敌人的图像。 - `monster_name` 是敌人的名称。 ```python self.status = 'idle' ``` - `self` 代表对象本身。 - `status` 是敌人的状态。 - `'idle'` 是字符串类型,代表敌人正在闲置状态。 ```python self.image = self.animations[self.status][self.frame_index] ``` - `self` 代表对象本身。 - `image` 是敌人的图像。 - `self.animations[self.status][self.frame_index]` 是获取敌人当前状态下的某一帧图像。 ```python self.rect = self.image.get_rect(topleft=pos) ``` - `self` 代表对象本身。 - `rect` 是敌人的矩形区域。 - `self.image.get_rect(topleft=pos)` 是获取敌人的图像矩形区域,并将其左上角放置在 `pos` 的位置。 ```python self.hitbox = self.rect.inflate(0, -10) ``` - `self` 代表对象本身。 - `hitbox` 是敌人的攻击范围矩形区域。 - `self.rect.inflate(0, -10)` 是将敌人的矩形区域向内缩小 10 个像素,用于表示敌人的攻击范围。 ```python self.obstacle_sprites = obstacle_sprites ``` - `self` 代表对象本身。 - `obstacle_sprites` 是敌人所遇到的障碍物精灵组。 - `obstacle_sprites` 是传入的参数。 ```python self.monster_name = monster_name ``` - `self` 代表对象本身。 - `monster_name` 是敌人的名称。 - `monster_name` 是传入的参数。 ```python monster_info = monster_data[self.monster_name] self.health = monster_info['health'] self.exp = monster_info['exp'] self.speed = monster_info['speed'] self.attack_damage = monster_info['damage'] self.resistance = monster_info['resistance'] self.attack_radius = monster_info['attack_radius'] self.notice_radius = monster_info['notice_radius'] self.attack_type = monster_info['attack_type'] ``` - `monster_data` 是一个字典,用于存储不同敌人的属性。 - `monster_info = monster_data[self.monster_name]` 是获取当前敌人的属性信息。 - `self.health` 是敌人的生命值。 - `self.exp` 是敌人死亡时玩家获得的经验值。 - `self.speed` 是敌人的移动速度。 - `self.attack_damage` 是敌人攻击造成的伤害值。 - `self.resistance` 是敌人的抗性值。 - `self.attack_radius` 是敌人的攻击范围。 - `self.notice_radius` 是敌人的感知半径。 - `self.attack_type` 是敌人的攻击类型。 ```python self.can_attack = True self.attack_time = None self.attack_cooldown = 400 self.damage_player = damage_player self.trigger_death_particles = trigger_death_particles self.add_exp = add_exp ``` - `self.can_attack` 是一个布尔值,代表敌人是否可以攻击。 - `self.attack_time` 是一个时间戳,代表敌人上一次攻击的时间。 - `self.attack_cooldown` 是敌人攻击的冷却时间。 - `self.damage_player` 是敌人攻击造成的伤害值。 - `self.trigger_death_particles` 是敌人死亡时触发的粒子效果。 - `self.add_exp` 是敌人死亡时玩家获得的经验值。 ```python self.vulnerable = True self.hit_time = None self.invincibility_duration = 300 ``` - `self.vulnerable` 是一个布尔值,代表敌人是否可以受到伤害。 - `self.hit_time` 是一个时间戳,代表敌人上一次受到攻击的时间。 - `self.invincibility_duration` 是敌人的无敌时间。 ```python self.death_sound = pygame.mixer.Sound('../audio/death.wav') self.hit_sound = pygame.mixer.Sound('../audio/hit.wav') self.attack_sound = pygame.mixer.Sound(monster_info['attack_sound']) self.death_sound.set_volume(0.6) self.hit_sound.set_volume(0.6) self.attack_sound.set_volume(0.6) ``` - `pygame.mixer.Sound` 是 Pygame 库中的方法,用于加载音效文件。 - `self.death_sound` 是敌人死亡时播放的音效。 - `self.hit_sound` 是敌人受到攻击时播放的音效。 - `self.attack_sound` 是敌人攻击时播放的音效。 - `monster_info['attack_sound']` 是敌人攻击时对应的音效文件路径。 - `set_volume` 是设置音效的音量大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值