为什么x = Class()在python中创建一个新对象?

时间:2014-03-28 02:34:41

标签: python class oop

这是我的第一种编程语言,所以请保持温和。在OOP出现之前,我正在游泳地阅读我的书,我一直非常迷失。我在Python上用OOP买了一本新书只是,我仍然无法掌握基础知识。

首先,我正在努力应对“自我”概念,但我在概念上却在更基础的层面上迷失了。

为什么x = Class()会创建该类的新实例?它不会只是提到课堂吗?

如果我写y = Class(),那么即使我将它们定义为同一个东西,你怎么也不会找到两个引用同一个东西的不同变量呢?为什么不使用像“Instantiate(”name_of_new_instance“)Class()”这样的语言?

我不明白这里发生了什么。

编辑:很多答案都这么快!我是否理解这里的等号是任意的,就像编程相当于同音字? (同形异义词?)为什么选择这种方式,它似乎不太直观。我不批评它,有历史原因吗?在初学者身上是否会出现一些逻辑错误?

5 个答案:

答案 0 :(得分:1)

对类本身的引用只是Class。编写Class() 调用类,它返回类的实例。

def foo():
  return 42

print foo
print foo()

class Class(object):
  pass

print Class
print Class()

答案 1 :(得分:0)

你已经涵盖了各种功能,对吧?

类类似于生成新对象的函数。 Class()表示您正在调用它,每次调用它时,都会获得一个新对象。这就是上课时所做的事情。

x = Classx = Class()非常不同。事实上,前者只会为班级制作别名。

至于"为什么",好吧,它实际上非常方便能够将一个函数替换为一个类,反之亦然。例如,int()函数根本不是函数;您只需创建一个新的int对象。

关于=,嗯,没有任何借口:)大多数语言使用a = b表示"取b并将其存储在{{ 1}}",表示aa相等。我想是历史原因。

答案 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的设计有许多优点:

  • 它不那么冗长。
  • 更明确的是正在进行作业。
  • 在初始化Class
  • 的新实例时,它提供了一个更明显的位置来放置所需的任何参数
  • 大多数来自c-descended语言的程序员会更熟悉。

一旦您拥有了许多不同语言的经验,我希望您能够对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__