于末 2022-03-30 08:07 采纳率: 80%
浏览 88
已结题

Python中有self.属性名 = 其他模块类名(self)的语法吗?这种语法如何理解呢?

问题遇到的现象和发生背景

Python中有self.属性名 = 其他模块类名(self)的语法吗?这种语法如何理解呢?

问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

求指教

import pygame  # 导入游戏库game
import sys

from settings import Stiings # 导出参数类
from ship import Ship


class AlienInvasion(object):
    def __init__(self):
        """初始化游戏资源"""
        pygame.init()

        self.stiings = Stiings() # 将设置类赋值给初始化属性:self.stiings

        self.screen = pygame.display.set_mode((self.stiings.screen_width, self.stiings.screen_height))
        # pygame.display.set_mode创建一个显示窗口,让所有的图像元素都在里面绘制。
        # (1200, 800)是一个元组,定义了游戏窗口的尺寸,单位像素。并将这个值赋值给self.screen.使整个类都可以使用此属性

        pygame.display.set_caption("外星人入侵!")
        # 这是设置有序屏幕的标题

        # self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))

       self.ship = Ship(self)
        """请注意,此处在创建一个名称self.ship实例的同时。Ship()初始化缺少参数,需要当前类(AlienInvasion)将资源传递给self.ship,
        故加上Ship(self)。如:self.screen或者其他变量,self.ship实例在引用时,在初始化名称后面加上变量名称即可。
        """

        # self.bg_color = (230,230,230) 
        # 设置屏幕颜色,在pygame中的颜色是以rgb指定的,这种颜色由红色、绿色、蓝色组成。其中每一个的值的取值范围都是:0-255.
        # (0,255,0)绿色,(255,0,0)红色。(0,0,255)蓝色。我们将设计好的颜色赋值给:self.screen.fill()。让它使用我们设置的颜色

    def run_game(self):
        """开启游戏的主循环"""

        while True:

            # 监视鼠标和键盘的事件。意思是监控鼠标和键盘的操作
            for event in pygame.event.get():  # pygame.event.get这个函数包含它在上次调用后发送的所有事件(操作)
                # pygame.event.get()会生成一个列表,记录之前的所以时间进行for循环,并结合if语句判断是否需要执行以下的代码
                if event.type == pygame.QUIT:
                    sys.exit() # 监控到用户操作pygame.QUIT退出,则运行下面退出方法

            self.screen.fill(self.stiings.bg_color)
            # ,我们见设置好的颜色填充到屏幕中(窗口)。fill()只接收一个实参:一种颜色

            self.ship.blitme()

            # 让最近绘制的屏幕可见,每执行一次,会擦去旧屏幕,使得只展示新屏幕可见
            pygame.display.flip()


if __name__ == '__main__':
    # 创建游戏实例,并运行游戏
    ai = AlienInvasion()
    ai.run_game()


"""创建一个飞船类Ship"""
import pygame


class Ship(object): 
    """管理飞船的类"""

    def __init__(self, ai_game):
        """初始化飞船并设置初始化位置"""
       self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()  
        """此处需要注意,初始化时由于指向了AlienInvasion类,所以可以从AlienInvasion获取已存在的变量
        自定义变量 = 初始化名称.自主类变量名称(无需加self)。如:self.xxxx = ai_game.screen
        """

        # 加载飞船图像并获取其外接矩形
        self.image = pygame.image.load("images/ship.bmp")  # load
        # 属性名 = pygame.image.load("xx") 加载图片
        self.rect = self.image.get_rect()
        #self.rect = self.image.get_rect()是因为self.rect。要做知道图片矩形大小,以便后面根据当前大小定位所在位置

        # 对于没艘新飞船,都将其放在屏幕底部的中央
        self.rect.midbottom = self.screen_rect.midbottom
        # self.rect.midbottom = self.screen_rect.midbottom。要知道屏幕矩形大小于,同时确认居中坐标

        if self.screen_rect.midbottom == self.rect.midbottom:
            print("两个值相等")
            print(self.rect.midbottom)

    def blitme(self):
        """在指定位置绘制飞船"""
        self.screen.blit(self.image,self.rect) # blit位置


展开全部

  • 写回答

3条回答 默认 最新

  • ash062 2022-03-30 08:41
    关注

    给你造了一个

    class Simple:
        def __init__(self, S):
            self.p = S*(self)
        def __rmul__(self, a):
            return 'Are you ok?'
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    于末 2022-03-30 17:48

    你这个语法和我了解到的有些相似,可以解释一下:self.p = S*(self)这行代码吗

    回复
    ash062 回复 于末 2022-03-31 00:46

    这个应该和你给的代码里不太一样,这个是因为下面通过定义__rmul__重载了右乘运算符,S*(self)先检查S中的__mul__即左乘能否运行(不行),不能的话检查self的__rmul__即右乘能否运行(可以),然后调用__rmul__(self, S)返回值作为self.p的值。
    你写的那个self.ship = Ship(self)是通过传入AlienInvasion对象作为Ship类的初始化参数,然后把新建的Ship(self)对象再赋予AlienInvasion的ship属性,算是蛮常见的用法。

    回复
    于末 回复 ash062 2022-03-31 07:01

    好的,非常感谢。你知道这种类型的语法有出处文档不

    回复
    展开全部5条评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月31日
  • 修改了问题 3月31日
  • 修改了问题 3月30日
  • 展开全部

悬赏问题

  • ¥50 有偿求qftp工具。能连接,下载文件,发送代码,windows环境,最好qt6 要qt creator写的
  • ¥70 刚刚看到一个人的网站居然是通过cname访问的
  • ¥15 Attributeerror:super object has no attribute '__sklearn_tags__'_'
  • ¥15 逆置单链表输出不完整
  • ¥15 宇视vms-B200-A16@R启动不了,如下图所示,在软件工具搜不到,如何解决?(操作系统-linux)
  • ¥500 寻找一名电子工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部