我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
我正在学习Python编程语言,我遇到了一些我不完全理解的东西。
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
self做什么?这意味着什么?这是强制性的吗?
__init__方法是做什么的?为什么有必要?(等)
我认为它们可能是面向对象结构,但我知道的不多。
当前回答
类对象支持两种操作:属性引用和实例化
属性引用使用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 :)
其他回答
Python __init__和self它们做什么? self做什么?这意味着什么?这是强制性的吗? __init__方法是做什么的?为什么有必要?(等)
给出的例子是不正确的,所以让我基于它创建一个正确的例子:
class SomeObject(object):
def __init__(self, blah):
self.blah = blah
def method(self):
return self.blah
当我们创建对象的实例时,会在对象创建后调用__init__来自定义对象。也就是说,当我们在下面用'blah'(可以是任何东西)调用SomeObject时,它会作为参数传递给__init__函数,blah:
an_object = SomeObject('blah')
self参数是SomeObject的实例,它将被赋值给an_object。
稍后,我们可能想在这个对象上调用一个方法:
an_object.method()
执行点查找,即an_object。方法,将实例绑定到函数的一个实例,并且该方法(如上所述)现在是一个“绑定”方法——这意味着我们不需要显式地将实例传递给方法调用。
方法调用获取实例,因为它绑定在点查找上,当调用时,执行它被编程执行的任何代码。
隐式传递的self参数按照约定称为self。我们可以使用任何其他合法的Python名称,但如果您将其更改为其他名称,则可能会受到其他Python程序员的批评。
__init__是一个特殊的方法,在Python数据模型文档中有说明。它在实例创建后立即被调用(通常通过__new__ -尽管__new__不是必需的,除非你要继承一个不可变的数据类型)。
注意,self实际上可以是任何有效的python标识符。例如,从Chris B的例子中,我们可以简单地写:
class A(object):
def __init__(foo):
foo.x = 'Hello'
def method_a(bar, foo):
print bar.x + ' ' + foo
结果是一样的。然而,建议使用self,因为其他python更容易识别它。
是的,你是对的,这些是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__(如本文所述,负责初始化新创建的实例)。
简而言之:
正如它所暗示的那样,Self指的是它自己——调用方法的对象。也就是说,如果你有N个对象调用这个方法,那么self。a将引用N个对象中每个对象的变量的一个单独实例。假设每个对象有N个变量a的副本 __init__在其他OOP语言(如c++ /Java)中被称为构造函数。基本思想是,它是一个特殊的方法,当创建该类的对象时自动调用
在这里,这个家伙写得很好,很简单:https://www.jeffknupp.com/blog/2014/06/18/improve-your-python-python-classes-and-object-oriented-programming/
阅读上面的链接作为参考:
self? So what's with that self parameter to all of the Customer methods? What is it? Why, it's the instance, of course! Put another way, a method like withdraw defines the instructions for withdrawing money from some abstract customer's account. Calling jeff.withdraw(100.0) puts those instructions to use on the jeff instance. So when we say def withdraw(self, amount):, we're saying, "here's how you withdraw money from a Customer object (which we'll call self) and a dollar figure (which we'll call amount). self is the instance of the Customer that withdraw is being called on. That's not me making analogies, either. jeff.withdraw(100.0) is just shorthand for Customer.withdraw(jeff, 100.0), which is perfectly valid (if not often seen) code. init self may make sense for other methods, but what about init? When we call init, we're in the process of creating an object, so how can there already be a self? Python allows us to extend the self pattern to when objects are constructed as well, even though it doesn't exactly fit. Just imagine that jeff = Customer('Jeff Knupp', 1000.0) is the same as calling jeff = Customer(jeff, 'Jeff Knupp', 1000.0); the jeff that's passed in is also made the result. This is why when we call init, we initialize objects by saying things like self.name = name. Remember, since self is the instance, this is equivalent to saying jeff.name = name, which is the same as jeff.name = 'Jeff Knupp. Similarly, self.balance = balance is the same as jeff.balance = 1000.0. After these two lines, we consider the Customer object "initialized" and ready for use. Be careful what you __init__ After init has finished, the caller can rightly assume that the object is ready to use. That is, after jeff = Customer('Jeff Knupp', 1000.0), we can start making deposit and withdraw calls on jeff; jeff is a fully-initialized object.