sam*_*mpy 5 python oop constructor initialization class
我读到构造函数就像传递给类的第一个参数一样,这对我来说很有意义,因为参数似乎是通过__init__方法传递给类的。例如,
class NewsStory(object):
def __init__(self, guid, title, subject, summary, link):
self.guid = guid
self.title = title
self.subject = subject
self.summary = summary
self.link = link
def get_guid(self):
return self.guid
def get_title(self):
return self.title
def get_subject(self):
return self.subject
def get_summary(self):
return self.summary
def get_link(self):
return self.link
firstStory = NewsStory('Globally Unique Identifier', \
'first_title','first_subject','This is an example \
sumary','example_link@something.com')
print firstStory.get_guid() # prints Globally Unique Identifier
Run Code Online (Sandbox Code Playgroud)
因此,当我“调用”该类时,是否将__init__方法中的参数传递给它?我是班上的新手,我读到的所有内容我都很难理解和混淆。谢谢!
编辑1
我发现这个问题有助于解释某些事情,例如new和init之间的区别,抱歉,我不知道如何添加链接,必须剪切和粘贴:__init__可以做什么,__new__不能呢?
我在这里看到构造函数之间的误解 - 构造对象和初始化对象:
使用
__new__时,你需要控制一个创建新实例。使用__init__时,你需要一个新的实例的控件初始化。
所以我们在这里必须小心。
我读到构造函数就像传递给类的第一个参数,这对我来说很有意义,因为参数似乎是通过
__init__方法传递给类的。
构造函数不会传递给类,准确地说,构造函数 ( __new__)的结果将是类或其子类中每个实例方法的第一个参数(注意:__new__仅适用于新式类):
class A:
def __new__(self):
return 'xyz'
Run Code Online (Sandbox Code Playgroud)
看看当你调用类(创建对象)时会发生什么:
>>> A()
'xyz'
>>> type(A())
<class 'str'>
Run Code Online (Sandbox Code Playgroud)
调用类不再返回类型的实例A,因为我们改变了构造函数的机制__new__。实际上,通过这样做,您改变了类的整个含义,不仅如此,这很难破译。您不太可能在该特定对象的创建期间切换对象的类型。我希望这句话有意义,如果没有,它在您的代码中如何有意义!
class A:
def __new__(self):
return 'xyz'
def type_check(self):
print(type(self))
Run Code Online (Sandbox Code Playgroud)
看看当我们尝试调用type_check方法时会发生什么:
>>> a = A()
>>> a
'xyz'
>>> a.type_check()
AttributeError: 'str' object has no attribute 'type_check'
Run Code Online (Sandbox Code Playgroud)
a不是 class 的对象A,所以基本上你不能A再访问 class了。
__init__用于初始化对象的状态。通过在创建期间初始化对象的成员__init__来解决此问题,而不是调用将在创建后初始化对象成员的方法,因此,如果您name在类内部调用了一个成员,并且您想name在创建类时进行初始化而不是调用额外的方法init_name('name'),您肯定会__init__为此目的使用。
因此,当我“调用”该类时,我将
__init__方法中的参数传递给它?
当你调用类时,你传递了参数(to)__init__方法?
无论您向类传递什么参数,所有参数都将传递给__init__并自动为您添加一个附加参数,该参数通常称为隐含对象self(实例本身),Python将始终自动将其作为最左边的参数传递:
class A:
def __init__(self, a, b):
self.a = a
self.b = b
Run Code Online (Sandbox Code Playgroud)
A( 34, 35)
self.a = 34 | |
| |
| | self.b = 35
init(self, a, b)
|
|
|
The instance that you created by calling the class A()
Run Code Online (Sandbox Code Playgroud)
注意: __init__适用于经典类和新样式类。然而,__new__工程仅适用于新的样式类。
| 归档时间: |
|
| 查看次数: |
12291 次 |
| 最近记录: |