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