自我之后何时需要参数

时间:2018-12-20 05:09:46

标签: python python-3.x oop

我是python的新手,我对类有疑问。创建完一个类之后,当您使用def init (self)时,何时有必要在self之后加上参数。在某些pygame中,我看到它们有时包括但有时不包括在以下代码中,这些代码用于游戏设置(Alien Invasion)和绘制飞船:我很困惑为什么在主程序中有一个screen参数定义显示,并且设置中没有参数。请解释,谢谢。

class Ship():
    def __init__(self, screen):

    # initializes the screen and set its starting postion
    self.screen = screen

    # now we load the image

    self.image = pygame.image.load("ship.bmp")
    self.rect = self.image.get_rect()
    self.screen_rect = screen.get_rect()

    # starting ship at each bottom of screen

    self.rect.centerx = self.screen_rect.centerx
    self.rect.bottom = self.screen_rect.bottom

def blitme(self):
    # drawing ship at its locations, use blitme
    self.screen.blit(self.image, self.rect)

class Settings():
    def __init__(self):
        self.screen_width = 1000
        self.screen_height = 700
        self.bg_color = (230, 230, 230)

3 个答案:

答案 0 :(得分:0)

“ self”之后的

参数(如self.image),允许您初始化对象“ Ship”并在类外使用它。它定义属性来表征对象“ Ship”。它允许您进行面向对象的编程(OOP) 您可以定义所有想要的属性:

self.speed = 10 

如果要初始化对象的移动速度。

您可以查看此文档:class python

但是我认为您必须阅读面向对象的编程文档才能理解所有概念。在编程中,了解这一点非常重要。不仅适用于Python,而且适用于所有语言。 (Java,C,C#...)。

答案 1 :(得分:0)

方法是一种功能。功能参数是可选的。函数是否应具有参数取决于函数的用途。每个功能应针对特定任务而设计;有些人可能需要争论,而另一些人可能不需要。

Python面向对象的程序设计为the first parameter of methods is the instance the method is called on。这样就可以像常规函数一样调用方法。使用#import <Foundation/Foundation.h> int main (int argc, const char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; if (argc < 2) { // Use ~/Application directory if no command line arguments are provided NSString *localizedApplicationDirectoryName = [[NSFileManager defaultManager] displayNameAtPath:NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, YES).lastObject]; NSLog(@"%@", localizedApplicationDirectoryName); [pool drain]; return 1; } // Use command line arguments NSFileManager *fileManager = [[NSFileManager alloc] init]; NSString *directory = [NSString stringWithUTF8String:argv[1]]; NSString *displayName = [fileManager displayNameAtPath:directory]; NSLog(@"%@", displayName); [pool drain]; return 0; } 而不是self只是一种约定,但是为了便于阅读,您可能应该遵循该约定。

答案 2 :(得分:0)

我认为您将从一个简单的示例中受益。考虑一下何时创建类的实例。如果只将类构造函数保留为具有单个“ self”参数,则无需提供任何参数。

my_dog = Dog()

但是,就像其他功能一样,您可能需要预先提供有关所创建的狗的一些信息。假设当您要创建Dog对象时,您想要提供其名称以及是否吠叫或叮咬。设置狗类时,可以在构造函数中指定在制作Dog类的实例时应指定这些类:

class Dog(object):
    def __init__(self, name, barks, bites):
        self.name = name
        self.barks = barks
        self.bites = bites

现在,当您创建类的实例时,可以预先指定以下参数:

my_dog = Dog('Rover', barks=True, bites=False)

这意味着您可以控制在创建类实例时需要传递哪些信息。在这种情况下,代码的创建者希望在创建类的实例时使用与“屏幕”相关的一条信息。您编写的其他类可能不需要任何其他信息,因此它们仅使用“ self”。

就像编写函数时一样,您要负责它们所采用的参数,而类的情况则完全相同。