我真的希望这不是数百万新手提出的问题,但我的搜索并没有给我一个满意的答案。
所以我的问题很简单。类基本上是具有自己的命名空间的函数的容器吗?除了提供单独的命名空间和保持函数同时使它们可以作为类属性调用之外,它们还有什么其他功能?我在python语境中提问。
哦,谢谢大多数人的大力帮助!
答案 0 :(得分:9)
例如,这是一个适度有用的课程。由于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
的插件替代品。这被称为polymorphism,这是基于OO /类的编程的最大好处之一。
(另外,dict
是一个类,因此使用它违反了没有类的假设:)
答案 1 :(得分: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
的对象。
这个对象(类)本身能够创建对象(实例),这就是为什么它是一个类。
但是,它仍然是一个对象,因此:
e.g:
>>> 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>
答案 2 :(得分:4)
类(或对象)用于提供可对该数据执行的数据和操作的封装。
它们本身不提供Python中的命名空间;模块导入提供相同类型的东西,模块可以完全起作用而不是面向对象。
您可以通过查看OOP With Python,Dive into Python, Chapter 5. Objects and Object Oriented Programming甚至只是object oriented programming上的维基百科文章获得一些好处
答案 3 :(得分:3)
类是对象的定义。从这个意义上说,类提供了各种命名空间,但这不是类的真正目的。真正的目的是定义对象将“看起来像什么” - 对象能够做什么(方法)以及它将知道什么(属性)。
请注意,我的答案旨在提供一个相对非技术层面的理解感,这是我最初的理解课程的麻烦。我相信这个问题会有很多其他很好的答案;我希望这个增加你的整体理解。