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->
,那么如果我的源代码在类外也有一个变量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->
让读者更清楚。但是::
是另一回事。用于访问静态成员变量或函数。
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 如果您想访问嵌套类Nest
的static 成员,那么您可以像Nest::x++
一样进行操作。如果您想访问嵌套类的 NON static 成员,则需要该类的 object 例如Nested nt; nt.x++
最后,从一个嵌套类到另一个嵌套类呢?即如果 cls
在同一级别有 2 个子类。以上是关于python中,在定义class时,是不是一定要使用__init__?的主要内容,如果未能解决你的问题,请参考以下文章