关于python类中的self:python类中的self

Self in python Class - I can do it with out it…?

本问题已经有最佳答案,请猛点这里访问。

考虑此代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class example(object):

    def __init__ (): # No self
        test()       # No self

    def test(x,y):   # No self
        return x+y

    def test1(x,y):  # No self
        return x-y

print(example.test(10,5))
print(example.test1(10,5))

15
5

这按预期工作。我相信我可以写一个完整的程序而不是用自己。我错过了什么?这个自我是什么?为什么它需要一些实际的方式?

我已经读了很多关于它的内容(栈、python文档),但是我不明白为什么需要它,因为我显然可以创建一个没有它的程序。


您没有正确使用类或对象。去掉垃圾代码,程序将减少到:

1
2
3
4
5
6
7
8
9
10
11
12
13
def test(x,y): #No class
    return x+y

def test1(x,y): #No class
    return x-y

print(example.test(10,5))
print(example.test1(10,5))

Output:

15
5

您的"类"并不比将程序包装在嵌套结构中更有用:

1
2
3
if True:
    for i in range(1):
        ...

适当的对象将具有对该数据进行操作的属性(数据字段)和函数(见下文)。您的代码有一个空对象;因此,您没有任何可操作的对象,不需要自我,也根本不需要类。

相反,当需要封装数据表示和相关操作时,可以使用类。下面,我重用了您的一些代码,使示例能够完成一些简单的复数工作。在这方面有许多扩展和改进;我使它与您的原始工作相对接近。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class example(object):

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        sign = ' + ' if self.b >= 0 else ' - '
        return str(self.a) + sign + str(abs(self.b)) + 'i'

    def add(self, x):
        self.a += x.a
        self.b += x.b

    def sub(self, x):
        self.a -= x.a
        self.b -= x.b

complex1 = example(10, 5)
complex2 = example(-3, 2)
complex1.add(complex2)
print(complex1)
complex2.sub(complex1)
print(complex2)

Output:

7 + 7i
-10 - 5i


你可以完美地创建一个没有它的程序。但是你会错过类的一个关键特性。如果你没有自我,我认为你可以不用类,仅仅用函数来做一些事情。

类允许您创建具有关联属性的对象,而self允许您访问这些值。假设你有一个正方形。

G代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Square(object):

    def __init__ (self, length, height):
        self.length = length # THIS square's length, not others
        self.height = height # THIS square's height, not other

    def print_length_and_height(self):
        print(self.length, self.height) # THIS square's length and height



square1 = Square(2,2)
square2 = Square(4,4)
square1.print_length_and_height() # 2 2
square2.print_length_and_height() # 4 4

当然,这个例子很愚蠢,但我认为它表明了自我的特殊意义:它指的是一个物体的特定实例。

当然,如果你看不到它的意义,只需去掉类并使用函数,这没有什么错。


你熟悉面向对象的范式吗?如果你没有,你应该检查一下。python是一种面向对象的语言,self允许您定义对象属性。一个例子:您有一个名为Vehicle的类。一辆车可以是自行车,汽车,甚至飞机。所以你可以包括一个名字和一个类型。

1
2
3
4
5
6
7
class Vehicle():
  def init(self, name, type): # Constructor
    self.name = name
    self.type = type
  def info(self):
    print("I'm a")
    print(self.name)

仅此而已,现在您有了一个具有名称和类型的车辆。车辆的每个实例都有一个不同的名称和类型,或者没有,每个入口都可以访问自己的变量。对不起,我解释不清楚。首先,你需要了解面向对象的范例知识。如果您有疑问,请评论我的答案。我会回答您,或者提供一个链接,以便更好地解释。