Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么x=Class()在python中创建一个新对象?_Python_Class_Oop - Fatal编程技术网

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

为什么x=Class()在python中创建一个新对象?,python,class,oop,Python,Class,Oop,这是我的第一种编程语言,所以要温柔。在OOP出现之前,我正在顺利地阅读我的书,我已经非常迷路了。我买了一本关于Python中OOP的新书,但我仍然不能掌握基本知识 首先,我在与“自我”的概念作斗争,但我在概念上迷失在更基本的层面上 为什么x=Class()会创建该类的新实例?这不是指课堂吗 如果我也写y=Class(),那么即使我将它们定义为同一事物,你怎么也不会得到引用同一事物的两个不同变量呢?为什么不使用类似“实例化(“新实例的名称”)类()这样的语言呢 我不明白这里发生了什么 编辑:这么快

这是我的第一种编程语言,所以要温柔。在OOP出现之前,我正在顺利地阅读我的书,我已经非常迷路了。我买了一本关于Python中OOP的新书,但我仍然不能掌握基本知识

首先,我在与“自我”的概念作斗争,但我在概念上迷失在更基本的层面上

为什么x=Class()会创建该类的新实例?这不是指课堂吗

如果我也写y=Class(),那么即使我将它们定义为同一事物,你怎么也不会得到引用同一事物的两个不同变量呢?为什么不使用类似“实例化(“新实例的名称”)类()这样的语言呢

我不明白这里发生了什么


编辑:这么快就有很多答案了!那么我能理解这里的等号是任意的吗,就像编程中的同音词一样?(同形异义词?)为什么选择这种方式,它似乎不是很直观。我不是在批评,有历史原因吗?下面是否有一些逻辑是初学者所无法理解的?

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

def foo():
  return 42

print foo
print foo()

class Class(object):
  pass

print Class
print Class()

你讲过函数,对吗

类的行为类似于生成新对象的函数
Class()
表示您正在调用它,每次调用它时,都会得到一个新对象。这正是类在被调用时所做的

x=Class
x=Class()
非常不同。事实上,前者只是为类创建了一个别名

def foo():
  return 42

print foo
print foo()

class Class(object):
  pass

print Class
print Class()
至于“为什么”,有时候用函数替换类或者用函数替换类是非常方便的。例如,
int()
函数根本不是函数;您只是在创建一个新的
int
对象


至于
=
,那么,这是没有理由的:)大多数语言使用
a=b
来表示“取
b
并存储在
a
”,来表示
a
b
是相等的。我想是历史原因。

当您执行
x=Class()
时,您实际上是在创建一个名为
x
的类
的新对象实例。这就是OOP的全部内容

self
变量在类中用于引用特定于该类特定实例的变量

def foo():
  return 42

print foo
print foo()

class Class(object):
  pass

print Class
print Class()
例如:

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"
你问:

为什么不使用类似“实例化(“新实例的名称”) 类()“

答案是Python与该语言完全相同——只是它省略了不必要的单词
Instantiate
,而是使用等号表示正在进行赋值。除了语法上的微小差异(而且毫无意义),这些语言是相同的

虽然我喜欢在您的语言中使用关键字
Instantiate
,因为它非常清楚正在发生的事情,但我也认为Python的设计有很多优点:

  • 没那么冗长
  • 更清楚的是,任务正在进行
  • 它提供了一个更明显的位置,可以放置初始化类的新实例时所需的任何参数
  • 对于大多数来自c语言的程序员来说,这将更加熟悉

一旦您有了使用多种不同语言的经验,我希望您能分享我对Python设计者做出的聪明决策的欣赏,这些决策使(优秀的)Python代码既清晰又极其简洁。当然,您可能会有不同的感觉,在这种情况下,您会发现许多不同语言中都有可用的语法,或者,您可能会发现需要开发自己的语法。

您可以看到一个类的一个对象成员的安装,如下所示:

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
,然后调用
\uuuu init\uuuu
class
的类是对类的引用
class()
正在创建新对象。这是python语法。在许多类似C++的语言中,“为什么”这个问题在这里毫无意义。Python就是这样设计的。如果你想实例化(“新实例的名称”)
你可以自由地设计和实现你自己的语言。你可能会发现这很有用:。
x={}
y={}
也创建两个独立的对象,即使它们使用相同的语法。Hm。。。好吧,这其实有点道理。那么,我可以把它看作是给变量分配一个类型,并赋予它属性吗?我认为这是一个非常令人困惑的答案。类的行为不像函数。这只是构造函数调用语法。类的行为绝对像函数:使用参数调用它们并获得返回值。python不在乎。它只看到带有
\uuuu调用\uuuu
方法的东西。当你想调用它们时,它们就像函数一样。在所有其他方面,它们的行为都不同。当然,但问题是如何称呼它们:)归根结底,问题是:称呼并不特别,而类是你可以称呼的另一种东西。我没有发现这一点非常令人困惑,tbh。我能想象当我创造一只新狗并称它为“斑点”时,比如说,自我会被“斑点”取代吗?因此spot.name=name,spot.type=type,等等?@user3471004,
self.name
变量被分配字符串“spot”。
self.name
本质上类似于
dog1.name
。它特定于您创建的
Dog
类的特定实例,所以“实例化”很难键入;)@这怎么会“误导”呢?问题是关于班级建设。迟早,对Python类感兴趣的人需要学习这一点。这并不难。
\uuuu new\uuuu
很少是必要的或有用的,但我看到的不仅仅是一对夫妇