我正在学习Python编程语言,我遇到了一些我不完全理解的东西。

在如下方法中:

def method(self, blah):
    def __init__(?):
        ....
    ....

self做什么?这意味着什么?这是强制性的吗?

__init__方法是做什么的?为什么有必要?(等)

我认为它们可能是面向对象结构,但我知道的不多。


__init__确实像一个构造函数。如果您希望任何类函数表现为非静态方法,则需要将“self”作为第一个参数传递给它们。self是类的实例变量。


是的,你是对的,这些是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__(如本文所述,负责初始化新创建的实例)。


在这段代码中:

class A(object):
    def __init__(self):
        self.x = 'Hello'

    def method_a(self, foo):
        print self.x + ' ' + foo

... self变量表示对象本身的实例。大多数面向对象语言将此作为一个隐藏参数传递给对象上定义的方法;Python则不然。你必须显式地声明它。当你创建一个A类的实例并调用它的方法时,它将被自动传递,就像在…

a = A()               # We do not pass any argument to the __init__ method
a.method_a('Sailor!') # We only pass a single argument

__init__方法大致代表Python中的构造函数。当你调用A()时,Python为你创建一个对象,并将其作为第一个参数传递给__init__方法。任何额外的参数(例如,A(24, 'Hello'))也会作为参数传递——在这种情况下会引发异常,因为构造函数并不期望它们。


简而言之:

正如它所暗示的那样,Self指的是它自己——调用方法的对象。也就是说,如果你有N个对象调用这个方法,那么self。a将引用N个对象中每个对象的变量的一个单独实例。假设每个对象有N个变量a的副本 __init__在其他OOP语言(如c++ /Java)中被称为构造函数。基本思想是,它是一个特殊的方法,当创建该类的对象时自动调用


self是类实例的引用

class foo:
    def bar(self):
            print "hi"

现在我们可以创建一个foo实例并调用它的方法,self参数在本例中由Python添加:

f = foo()
f.bar()

但是如果方法调用不在类实例的上下文中,它也可以被传入,下面的代码做同样的事情

f = foo()
foo.bar(f)

有趣的是,变量名“self”只是一种约定。下面的定义将工作完全相同..说了这么多,这是一种非常强烈的惯例,应该一直遵循,但它确实说明了语言的灵活性

class foo:
    def bar(s):
            print "hi"

注意,self实际上可以是任何有效的python标识符。例如,从Chris B的例子中,我们可以简单地写:

class A(object):
    def __init__(foo):
        foo.x = 'Hello'

    def method_a(bar, foo):
        print bar.x + ' ' + foo

结果是一样的。然而,建议使用self,因为其他python更容易识别它。


基本上,当在同一个类中的多个函数中使用一个变量时,需要使用'self'关键字。至于init,它用于设置默认值,以防该类中没有其他函数被调用。


试试这段代码。希望它能帮助很多像我一样的C程序员学习Py。

#! /usr/bin/python2

class Person:

    '''Doc - Inside Class '''

    def __init__(self, name):
        '''Doc - __init__ Constructor'''
        self.n_name = name        

    def show(self, n1, n2):
        '''Doc - Inside Show'''
        print self.n_name
        print 'Sum = ', (n1 + n2)

    def __del__(self):
        print 'Destructor Deleting object - ', self.n_name

p=Person('Jay')
p.show(2, 3)
print p.__doc__
print p.__init__.__doc__
print p.show.__doc__

输出:

Jay

Sum = 5

博士-内部类

Doc - __init__构造函数

医生-内情秀

析构函数删除对象- Jay


一个简单的说明性例子

希望它能有所帮助,这里有一个简单的例子,我用它来理解在类中声明的变量和在__init__函数中声明的变量之间的区别:

class MyClass(object):
    i = 123
    def __init__(self):
        self.i = 345
     
a = MyClass()
print(a.i)
print(MyClass.i)

输出:

345
123

我自己也很难理解。即使在看完答案之后。

要正确理解__init__方法,你需要理解self。

self参数

__init__方法接受的参数是:

def __init__(self, arg1, arg2):

但实际上我们只传递了两个参数:

instance = OurClass('arg1', 'arg2')

额外的论证从何而来?

当我们通过名称(或引用)访问对象的属性时。这里的instance是对新对象的引用。我们使用instance.printargs访问实例对象的printargs方法。

为了从__init__方法中访问对象属性,我们需要一个对象引用。

每当调用方法时,对主对象的引用将作为第一个参数传递。按照惯例,你总是调用方法self的第一个参数。

这意味着在__init__方法中我们可以这样做:

self.arg1 = arg1
self.arg2 = arg2

这里我们在对象上设置属性。您可以通过以下方法验证这一点:

instance = OurClass('arg1', 'arg2')
print instance.arg1
arg1

这样的值称为对象属性。这里__init__方法设置实例的arg1和arg2属性。

来源:http://www.voidspace.org.uk/python/articles/OOP.shtml init方法


在这里,这个家伙写得很好,很简单: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.


在这段代码中:

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

__init__基本上是一个函数,它将为特定对象“初始化”/“激活”类的属性,一旦创建并匹配到相应的类。 Self表示将继承这些属性的对象。


# Source: Class and Instance Variables
# https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

class MyClass(object):
    # class variable
    my_CLS_var = 10

    # sets "init'ial" state to objects/instances, use self argument
    def __init__(self):
        # self usage => instance variable (per object)
        self.my_OBJ_var = 15

        # also possible, class name is used => init class variable
        MyClass.my_CLS_var = 20


def run_example_func():
    # PRINTS    10    (class variable)
    print MyClass.my_CLS_var

    # executes __init__ for obj1 instance
    # NOTE: __init__ changes class variable above
    obj1 = MyClass()

    # PRINTS    15    (instance variable)
    print obj1.my_OBJ_var

    # PRINTS    20    (class variable, changed value)
    print MyClass.my_CLS_var


run_example_func()

self做什么?这意味着什么?这是强制性的吗?

每个类方法(包括init)的第一个参数始终是对类当前实例的引用。按照惯例,这个参数总是命名为self。在init方法中,self指向新创建的对象;在其他类方法中,它引用被调用方法的实例。

Python不会强制你使用"self"。你可以给它起任何你想要的名字。但是记住方法定义中的第一个参数是对对象的引用。Python为你将self参数添加到列表中;在调用方法时不需要包含它。 如果你没有在init方法中提供self,那么你会得到一个错误

TypeError: __init___() takes no arguments (1 given)

init方法做什么?为什么有必要?(等)

Init是initialization的缩写。它是一个构造函数,当你创建类的实例时调用它,这是不必要的。但通常我们的做法是编写init方法来设置对象的默认状态。如果你不愿意在初始时设置对象的任何状态,那么你不需要编写这个方法。


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__不是必需的,除非你要继承一个不可变的数据类型)。


只是这个问题的一个演示。

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

类对象支持两种操作:属性引用和实例化

属性引用使用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 :)