3

我真的希望这不是数百万新手提出的问题,但我的搜索并没有真正给我一个令人满意的答案。

所以我的问题很简单。类基本上是具有自己命名空间的函数的容器吗?除了提供单独的命名空间和保持函数同时使它们可作为类属性调用之外,它们还有哪些其他函数?我在 python 上下文中询问。

哦,感谢你们大多数人的大力帮助!

4

4 回答 4

9
  1. 比函数更重要的是,类实例包含数据属性,允许您定义超出语言内置的新数据类型;和
  2. 他们支持继承鸭子类型

例如,这是一个适度有用的类。由于 Python 文件(使用 创建open)不记得自己的名字,让我们创建一个文件类来记住它们自己的名字。

class NamedFile(object):
    def __init__(self, name):
        self._f = f
        self.name = name

    def readline(self):
        return self._f.readline()

如果 Python 没有类,你可能会使用 dicts 代替:

def open_file(name):
    return {"name": name, "f": open(name)}

不用说,一直打电话myfile["f"].readline()会导致您的手指在某些时候受伤。readline你当然可以在模块(命名空间)中引入一个函数NamedFile,但是你总是必须使用那个确切的函数。相比之下,NamedFile实例可以在任何需要带有方法的对象的地方使用,因此在许多情况下readline它将成为插件的替代品。file这就是所谓的多态性,这是面向对象/基于类的编程的最大好处之一。

(另外,dict是一个类,所以使用它违反了没有类的假设:)

于 2012-06-20T12:40:37.487 回答
8

在大多数语言中,类只是描述如何生成对象的代码片段。在 Python 中也是如此:

>>> class ObjectCreator(object):
...       pass
... 

>>> my_object = ObjectCreator()
>>> print my_object
<__main__.ObjectCreator object at 0x8974f2c>

但是类不仅仅是 Python 中的类。类也是对象。

是的,对象。

一旦您使用关键字 class,Python 就会执行它并创建一个 OBJECT。指令:

>>> class ObjectCreator(object):
...       pass
... 

在内存中创建一个名为 的对象ObjectCreator

这个对象(类)本身能够创建对象(实例),这就是它是类的原因。

但是,它仍然是一个对象,因此:

  • 您可以将其分配给变量
  • 你可以复制它
  • 您可以为其添加属性
  • 您可以将其作为函数参数传递

例如:

>>> print ObjectCreator # you can print a class because it's an object
<class '__main__.ObjectCreator'>
>>> def echo(o):
...       print o
... 
>>> echo(ObjectCreator) # you can pass a class as a parameter
<class '__main__.ObjectCreator'>
>>> print hasattr(ObjectCreator, 'new_attribute')
False
>>> ObjectCreator.new_attribute = 'foo' # you can add attributes to a class
>>> print hasattr(ObjectCreator, 'new_attribute')
True
>>> print ObjectCreator.new_attribute
foo
>>> ObjectCreatorMirror = ObjectCreator # you can assign a class to a variable
>>> print ObjectCreatorMirror.new_attribute
foo
>>> print ObjectCreatorMirror()
<__main__.ObjectCreator object at 0x8997b4c>
于 2012-06-20T12:41:01.940 回答
4

类(或对象)用于提供数据封装和可以对该数据执行的操作。

它们本身不提供 Python 中的命名空间;模块导入提供相同类型的东西,一个模块可以完全是功能性的,而不是面向对象的。

您可能会从使用 Python 的 OOP深入 Python 中获得一些好处,第 5 章。对象和面向对象编程,甚至只是关于面向对象编程的 Wikipedia 文章

于 2012-06-20T12:41:33.657 回答
3

类是对象的定义。从这个意义上说,类提供了某种命名空间,但这不是类的真正目的。真正的目的是定义对象将“看起来像”什么——对象能够做什么(方法)以及它将知道什么(属性)。

请注意,我的回答旨在提供一种相对非技术层面的理解感,这就是我最初在理解课程时遇到的麻烦。我相信这个问题还会有很多其他很好的答案;我希望这能增加你的整体理解。

于 2012-06-20T12:42:17.563 回答