这是我的第一种编程语言,所以请保持温和。在OOP出现之前,我正在游泳地阅读我的书,我一直非常迷失。我在Python上用OOP买了一本新书只是,我仍然无法掌握基础知识。
首先,我正在努力应对“自我”概念,但我在概念上却在更基础的层面上迷失了。
为什么x = Class()会创建该类的新实例?它不会只是提到课堂吗?
如果我写y = Class(),那么即使我将它们定义为同一个东西,你怎么也不会找到两个引用同一个东西的不同变量呢?为什么不使用像“Instantiate(”name_of_new_instance“)Class()”这样的语言?
我不明白这里发生了什么。
编辑:很多答案都这么快!我是否理解这里的等号是任意的,就像编程相当于同音字? (同形异义词?)为什么选择这种方式,它似乎不太直观。我不批评它,有历史原因吗?在初学者身上是否会出现一些逻辑错误?
答案 0 :(得分:1)
对类本身的引用只是Class
。编写Class()
调用类,它返回类的实例。
def foo():
return 42
print foo
print foo()
class Class(object):
pass
print Class
print Class()
答案 1 :(得分:0)
你已经涵盖了各种功能,对吧?
类类似于生成新对象的函数。 Class()
表示您正在调用它,每次调用它时,都会获得一个新对象。这就是上课时所做的事情。
x = Class
与x = Class()
非常不同。事实上,前者只会为班级制作别名。
至于"为什么",好吧,它实际上非常方便能够将一个函数替换为一个类,反之亦然。例如,int()
函数根本不是函数;您只需创建一个新的int
对象。
关于=
,嗯,没有任何借口:)大多数语言使用a = b
表示"取b
并将其存储在{{ 1}}",不表示a
和a
相等。我想是历史原因。
答案 2 :(得分:0)
执行x = Class()
时,您实际上正在创建名为Class
的类x
的新对象实例。这就是OOP的全部内容。
类中使用self
变量来引用特定于该类特定实例的变量。
例如:
class Dog:
def __init__(self,name,type):
self.name = name
self.type = type
self.mood = "happy"
def change_mood(self):
if self.mood == "happy":
self.mood = "sad"
else:
self.mood = "happy"
dog1 = Dog("Adam","big")
dog2 = Dog("James","small")
dog1.change_mood()
>>> dog1.mood
"sad"
>>> dog2.mood
"happy"
答案 3 :(得分:0)
你问:
为什么不使用“Instantiate(”name_of_new_instance“)之类的语言 类()“?
答案是Python 完全就像那种语言一样 - 除了它省去了不必要的单词Instantiate
,而是使用等号来表示正在进行分配。除了语法上的那些小(和无意义)差异外,语言是相同的。
虽然我喜欢在您的语言中使用关键字Instantiate
,因为它非常清楚发生了什么,我也认为Python的设计有许多优点:
一旦您拥有了许多不同语言的经验,我希望您能够对Python设计人员做出的聪明决策以及使(优秀)Python代码既清晰又简洁的做法表示赞赏。当然,您可能会感到不同,在这种情况下,您会发现许多不同语言的语法世界,或者,您可能会发现需要开发自己的语法。
答案 4 :(得分:0)
您可以看到类的一个对象成员的实例化,如下所示:
class Foo(object):
def __new__(cls):
print 'new Foo'
return super(Foo, cls).__new__(cls)
def __init__(self):
print 'init Foo'
>>> foo=Foo()
new Foo
init Foo
在Python中,()
表示对类(或函数或方法)的调用。对于课程,首先调用new
然后调用__init__