我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
当前回答
是的,你是对的,这些是oop结构。
__init__是类的构造函数。self形参引用对象的实例(在c++中就像这样)。
class Point:
def __init__(self, x, y):
self._x = x
self._y = y
__init__方法在对象的内存被分配后被调用:
x = Point(1,2)
如果你想在对象中持久化这个值,在对象的方法中使用self参数是很重要的。例如,如果你像这样实现__init__方法:
class Point:
def __init__(self, x, y):
_x = x
_y = y
您的x和y参数将存储在堆栈上的变量中,当init方法超出作用域时将被丢弃。将这些变量设置为self。_x和self。_y将这些变量设置为Point对象的成员(在对象的生命周期内都可以访问)。
注意:对这个回答中“构造者”一词的使用做了一些澄清。从技术上讲,在Python中,“构造函数”的职责被划分为两个方法。这些方法是__new__(负责分配内存)和__init__(如本文所述,负责初始化新创建的实例)。
其他回答
__init__确实像一个构造函数。如果您希望任何类函数表现为非静态方法,则需要将“self”作为第一个参数传递给它们。self是类的实例变量。
self做什么?这意味着什么?这是强制性的吗?
每个类方法(包括init)的第一个参数始终是对类当前实例的引用。按照惯例,这个参数总是命名为self。在init方法中,self指向新创建的对象;在其他类方法中,它引用被调用方法的实例。
Python不会强制你使用"self"。你可以给它起任何你想要的名字。但是记住方法定义中的第一个参数是对对象的引用。Python为你将self参数添加到列表中;在调用方法时不需要包含它。 如果你没有在init方法中提供self,那么你会得到一个错误
TypeError: __init___() takes no arguments (1 given)
init方法做什么?为什么有必要?(等)
Init是initialization的缩写。它是一个构造函数,当你创建类的实例时调用它,这是不必要的。但通常我们的做法是编写init方法来设置对象的默认状态。如果你不愿意在初始时设置对象的任何状态,那么你不需要编写这个方法。
只是这个问题的一个演示。
class MyClass:
def __init__(self):
print('__init__ is the constructor for a class')
def __del__(self):
print('__del__ is the destructor for a class')
def __enter__(self):
print('__enter__ is for context manager')
return self
def __exit__(self, exc_type, exc_value, traceback):
print('__exit__ is for context manager')
def greeting(self):
print('hello python')
if __name__ == '__main__':
with MyClass() as mycls:
mycls.greeting()
$ python3 class.objects_instantiation.py
__init__ is the constructor for a class
__enter__ is for context manager
hello python
__exit__ is for context manager
__del__ is the destructor for a class
在这段代码中:
class Cat:
def __init__(self, name):
self.name = name
def info(self):
print 'I am a cat and I am called', self.name
在这里,__init__充当类的构造函数,当对象实例化时,将调用此函数。Self表示实例化对象。
c = Cat('Kitty')
c.info()
上述陈述的结果如下:
I am a cat and I am called Kitty
类对象支持两种操作:属性引用和实例化
属性引用使用Python中所有属性引用使用的标准语法:obj.name。有效属性名是创建类对象时类名称空间中的所有名称。所以,如果类定义是这样的:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
然后MyClass。i和MyClass。F是有效的属性引用,分别返回一个整数和一个函数对象。类属性也可以被赋值,所以你可以改变MyClass的值。我被指派。__doc__也是一个有效的属性,返回属于类的文档字符串:" a simple example class"。
类实例化使用函数表示法。假设类对象是一个返回类的新实例的无参数函数。例如:
x = MyClass()
实例化操作(“调用”类对象)创建一个空对象。许多类喜欢用自定义为特定初始状态的实例创建对象。因此,类可以定义一个名为__init__()的特殊方法,如下所示:
def __init__(self):
self.data = []
当类定义__init__()方法时,类实例化会自动为新创建的类实例调用__init__()。所以在这个例子中,一个新的,初始化的实例可以通过:
x = MyClass()
当然,__init__()方法可能有参数以获得更大的灵活性。在这种情况下,给类实例化操作符的参数被传递给__init__()。例如,
class Complex:
def __init__(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
x.r, x.i
这是从官方文件中截取的,最终对我帮助最大。
这是我的例子
class Bill():
def __init__(self,apples,figs,dates):
self.apples = apples
self.figs = figs
self.dates = dates
self.bill = apples + figs + dates
print ("Buy",self.apples,"apples", self.figs,"figs
and",self.dates,"dates.
Total fruitty bill is",self.bill," pieces of fruit :)")
创建类Bill的实例时:
purchase = Bill(5,6,7)
你会得到:
> Buy 5 apples 6 figs and 7 dates. Total fruitty bill is 18 pieces of
> fruit :)