Python 中的对象与实例
Objects vs instance in python
在C++中,只有对象和类,其中对象是类的实例。
在Python中,类定义(即类的主体(称为对象。而且,C++中的对象在python中称为实例。
检查这个
我错了吗?
编辑:实际上有人可以用对象与实例的示例来解释
编辑:在python中,一切都将从对象类继承,因此一切都是对象(即对象类的对象(。
类也是一个对象(即对象类的对象(。
实例是用于调用任何类的对象的名称(也称为 c++ 对象(。
请参考这个
在Python中,类定义(即类的主体(称为对象
。
实际上,这在 Python 中仍然被称为一个类。 这就是为什么你这样定义它:
class Foo(object):
pass
使用 class
关键字是因为结果仍称为类。
括号中的单词object
表示Foo派生自名为object
的类。 不要混淆 - 任何现有的类都可以在这里使用;事实上,不止一个。
您通常从object
派生类的原因是历史事故,但可能值得一提。Python 的原始对象实现将用户定义的类和内置类型视为略有不同的类型。然后语言的设计者决定统一这两个概念。因此,派生自object
(或来自object
的后代(的类的行为与非派生自object
的类略有不同,被称为新式类。另一方面,旧式类是这样定义的:
class Foo:
pass
class Bar(Foo):
pass
请注意,这些不会从object
继承,也不会从从object
继承的任何其他内容继承。这使它们成为旧式课程。
在使用Python 2.x时,你的类几乎总是从object
继承,因为新样式的对象在几个小而重要的方面更好用。
更令人困惑的是,在 Python 3.0 及更高版本中,没有旧式类,因此您不必显式从object
派生。换句话说,上述所有类都是Python 3.x中的新式类。
现在,回到手头的问题。类是对象,因为一切都是 Python 中的对象。列表,字典,整数,字符串,元组...所有这些都是对象,Python 程序的构建块也是如此:模块、函数和类。您可以使用 class
关键字创建一个类,然后将其传递给函数、修改它等(为了完整起见,您还可以使用 type()
函数创建一个类。
类是用于生成对象的模板,这些对象称为实例。这部分你已经知道了。实例化对象类似于调用函数,传入初始值和其他参数:
mylist = list("abc") # constructs ["a", "b", "c"]
在后台,这将创建一个实例,然后调用新实例的 __init__()
方法来初始化它。由于 Python 中的所有内容都是对象,因此类的实例也是对象。
您可能想知道的最后一件事是,正如类是用于构建对象的模板一样,也可以拥有用于构建类的模板。这些称为元类。基元类称为type
(即普通的新式类是type
的实例(。
(是的,这与我之前提到的可用于创建类的type
相同,您可以调用它来创建类的原因是它是一个元类。
要创建自己的元类,请从type
派生它,如下所示:
class mymeta(type):
pass
元类是一个相当高级的 Python 主题,所以我不会讨论你可能使用它们做什么或如何做,但它们应该清楚地说明 Python 在"一切都是对象"概念上走了多远。
术语方面,类和实例在 Python 中都被称为对象,但对于普通 Python 程序员来说,这并不重要。你可以看到 Python 的类和实例,就像C++的类和实例一样:
class MyClass:
data = 1
mc = MyClass()
MyClass
是一个类,mc
是类MyClass
的实例。
不过,Python 本质上比C++动态得多,因此它的类也是对象。但这不是程序员通常接触的东西,所以你不必担心。
Python 中的所有内容都是一个对象。甚至是类,它们是元类的实例。
既然你要求"请英语",我会尽量以细节为代价让它变得简单。
让我们先忽略类和实例,只看对象。
Python 对象包含数据和函数,就像其他面向对象的编程语言中的对象一样。附加到对象的函数称为方法。
x = "hello" #now x is an object that contains the letters in "hello" as data
print x.size() #but x also has methods, for example size()
print "hello".size() #In python, unlike C++, everything is an object, so a string literal has methods.
print (5).bit_length() #as do integers (bit_length only works in 2.7+ and 3.1+, though)
类是关于如何构造新对象的描述(或配方,如果你愿意的话(。根据类描述构造的对象称为属于该类。属于一个类的花哨名称是该类的实例。
现在,早些时候我写过,在Python中,一切都是一个对象。嗯,这也适用于函数和类之类的东西。因此,如何制作新对象的描述本身就是一个对象。
class C: #C is a class and an object
a = 1
x1 = C() #x1 is now an instance of C
print x1.a #and x1 will contain an object a
y = C #Since C is itself an object, it is perfectly ok to assign it to y, note the lack of ()
x2 = y() #and now we can make instances of C, using y instead.
print x2.a #x2 will also contain an object a
print C #since classes are objects, you can print them
print y #y is the same as C.
print y == C #really the same.
print y is C #exactly the same.
这意味着您可以像对待其他所有类(和函数(一样对待类(和函数(,例如,将它们作为参数发送到函数,函数可以使用它们来构造它从未知道存在的类的新对象。
在非常真实的意义上,Python 中的所有内容都是一个对象:一个类(或任何type(是一个对象,一个函数是一个对象,一个数字是一个对象...每个对象都有一个类型。 "类型"是一种特定类型的对象(a类,如果您愿意(,以及描述各种类型的属性(函数等(。 如果您习惯C++,那么您可以将其视为:
struct Type;
struct Object // The base class of everything.
{
Type* myType;
// Some additional stuff, support for reference counting, etc.
};
struct Type : Object
{
// Lots of additional stuff defining type attributes...
};
当你在Python中定义一个新类时,你实际上只是在创建一个新的类型实例;当你实例化该类时,Python 会初始化带有指向正确实例的Type
的指针的myType
成员。
但是请注意,一切都是动态的。 定义类型时 Toto
(通过执行类定义 - 即使定义类型也是运行时的东西,而不是编译时,如C++(,Python解释器创建 Type
的实例,并将其放入字典中(map<string, Object*>
,用C++的说法(某处。 当口译员遇到如下语句:
x = Toto()
,它在字典中查找 Toto:如果所引用Object
有类型 Type
,它构造该对象的新实例,如果它有类型Function
(函数也是对象(,它调用函数。(更一般地说,类型/类可能是可调用的,也可能不是;如果 Object
字典中找到的Toto
是可调用的,Python解释器执行对象定义"调用"的含义。 排序就像C++中超载operator()()
一样。 的超载 Type
operator()()
是构造该类型的新对象。
是的,如果你来自古典背景——严格的程序背景,结构化的,完全编译的语言,在第一。
- 对象实例化调用构造函数的次数太多
- C++ 中的基本单一实例对象
- 在 C++ 中,类实例对象 do memcpy 总是崩溃
- C++:在函数中使用当前实例(对象)
- 单一实例对象是否通过线程安全返回shared_ptr
- std::system 实例化单一实例对象时的异常
- 使用unique_ptr的单一实例对象
- 如果已创建 mongocxx::实例对象,则无法创建该对象
- 单一实例对象的未解决外部符号链接错误
- 实例对象如何查看函数的对象参数的私有成员?
- 在C++中调用单一实例对象的正确方法
- 声明模板化实例对象的函数指针
- 如何在"boost::function"中访问类实例(对象)指针?
- 删除单一实例对象 cpp 时出现内存泄漏
- 从 EXE 和 DLL 访问单一实例对象中的成员变量
- 如何在 C++11 中将 vector 与引用类型实例对象一起使用
- 为什么在构造函数退出时创建新的实例(对象)
- "类实例对象"未在此范围内声明
- c++实例对象的函数指针
- 如何正确存储多个实例对象