python中,在定义class时,是不是一定要使用__init__?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中,在定义class时,是不是一定要使用__init__?相关的知识,希望对你有一定的参考价值。

本人小白,自学python,在做习题是遇到一些问题。在定义一个class时,如果不使用__init__方法初始化实例时,代码能正常运行。但是使用__init__方法初始化实例时,缺提示如下:Traceback (most recent call last): File "lx1.py", line 29, in <module> s = Screen()TypeError: __init__() missing 3 required positional arguments: 'width', 'height', and 'resolution'

参考技术A 你的__init__有参数,所以你创建对象,要传入参数。
报错提示,就是你没有传入参数追问

那么应该怎样传入参数,需要怎样修改呢?

追答

你第3个参数没必要,因为它是有前两个参数计算得出的。所以可以先上车第3个参数
创建对象,这样写就可以传入参数:
s=Screen(1024,768)

本回答被提问者采纳

类成员是不是需要在类定义中以 `class::` 为前缀?

【中文标题】类成员是不是需要在类定义中以 `class::` 为前缀?【英文标题】:Do class members need to be prefixed with `class::` in class definitions?类成员是否需要在类定义中以 `class::` 为前缀? 【发布时间】:2013-05-10 13:08:16 【问题描述】:

在定义类cls 时,在cls 自己的定义中使用成员时,是否有必要(或良好做法)在成员前面加上类名称cls::,还是隐式完成?例如

class cls 
    int x;
    void foo();
    void bar();

void cls::foo() 
    x++;    // or use cls::x?
    bar();  // or cls::bar()?

如果是这样,那么创建一个类cls 是否自动意味着它也是一个命名空间(因为我认为:: 运算符只与命名空间一起使用)?

编辑(跟进): 如果我们不使用cls::this-&gt;,那么如果我的源代码在类外也有一个变量x 怎么办? cls::foo() 怎么知道x++ 指的是哪一个?

【问题讨论】:

在成员变量的名称前加前缀“x”是比较常见的,通常带有“m_”(即“m_x”)。这有助于将局部变量与类成员区分开来,从而消除您可能希望使用类名来限定成员范围的一个原因 【参考方案1】:

用类名明确限定成员变量的使用是一个坏主意。充其量,它是不必要的(或者在必要的情况下, this->member 更好)并禁止重构(如果重命名类,则需要更改更多地方),最坏的情况是它引入了错误,因为对虚函数的合格调用不会分派到覆盖的版本.

【讨论】:

【参考方案2】:

您在上面显示的代码定义一个类,但最初只声明成员函数(然后定义它们之后)。我之所以提到这一点,是因为术语对于有效沟通很重要。

如果你内联定义类成员,那么你就不用范围解析操作符::,例如:

class cls 
    void hello()  cout << "Hello world"; 
;

如果你分别定义它们,那么你确实需要它,因为否则编译器无法知道你打算定义什么函数:

class cls 
    void hello();
;

void cls::hello()  cout << "Hello world"; ;

一般来说,作用域解析操作符的使用并不局限于使用命名空间;您可以在需要向编译器提供完全限定名称时使用它。

在大多数情况下从类范围内访问类成员时,您可以使用它们的非限定名称;编译器将自行解决它们。例如,在您的代码中,所有这些都是等价的:

x++;
cls::x++;
this->x++;
this->cls::x++; // yes, this too

只要有多个具有相同名称的成员,并且编译器将非限定名称解析为您想要的成员之外的其他名称,您就需要限定名称。例子:

void cls::foo(int x) 
    x++;       // increments the argument
    cls::x++;  // increments the member
    this->x++; // also increments the member

还要考虑cls 可能派生自base,而base 也可能定义x。在这种情况下,它的工作方式如下:

void cls::foo() 
    x++;       // increments foo::x
    cls::x++;  // increments foo::x
    base::x++; // increments base::x

【讨论】:

【参考方案3】:

没有。至少不是这样。

您可以使用this-&gt; 让读者更清楚。但是:: 是另一回事。用于访问静态成员变量或函数。

int x;                  // Global x
namespace ot  int x;  // another x
class cls 
    int x;              // Normal member
    static int y;       // Static member
    void foo();
    static void bar();  // Static member function

void cls::foo() 
    this->x++;    // Modify own x. 
    x++           // Modify own x. This has implicit this->
    ::x++;        // Modify the global x.
    ot::x++;      // Modify the x in namespace ot.
    cls::y++;     // modify the static member
    cls::bar();   // static member function. same as bar()

【讨论】:

如果我的源代码在类外也有一个变量x 怎么办?如果我们不使用this,cls::foo() 怎么知道x++ 指的是哪一个? :: 用于非静态数据和函数成员,并可用于禁用虚拟调度。 嵌套类也一样吗? @MiloChen 如果您想访问嵌套类Neststatic 成员,那么您可以像Nest::x++ 一样进行操作。如果您想访问嵌套类的 NON static 成员,则需要该类的 object 例如Nested nt; nt.x++ 最后,从一个嵌套类到另一个嵌套类呢?即如果 cls 在同一级别有 2 个子类。

以上是关于python中,在定义class时,是不是一定要使用__init__?的主要内容,如果未能解决你的问题,请参考以下文章

类成员是不是需要在类定义中以 `class::` 为前缀?

python中定义class时self的理解

Python学习笔记__7.6章 使用原类

使用 Python 的 Pickle 加载时,如何将 module.Class() 替换为本地定义的 Class()?

class面向对象编程学习笔记

ImportError:在 python 中导入 swigged c++-class 时未定义的符号