Python 3.2:有关类,类属性和对象值的信息

时间:2013-04-06 06:48:00

标签: python class

我是Python新手,我正在学习类函数。有谁知道这方面的任何好的来源/例子?这是我写的一个例子。我正在尝试阅读有关自我和 init

的更多信息
class Example:
    def __init__(a, b, c, d):
        self.a = a
        self.b = b
        self.c = c
        self.d = d

test = Example(1, 1, 1, 1)

我去过python.org,以及这个网站。我也一直在读初学者Python书籍,但我想了解更多信息。

感谢。

3 个答案:

答案 0 :(得分:2)

这里有几个通用的说明:

  • Python" class"关键字不是一个函数,它是一个语句,它向语言发出以下代码描述一个类(用户定义的数据类型及其相关行为)的信号。 "类"取一个名字(以及一个可能为空的#34; parent"类列表)...并引入一个"套件" (缩进的代码块)。
  • " def"键盘是一个定义函数的类似语句。在您的示例中,已阅读:* def _init_ (self,a,b,c)*)您正在定义特殊类型的功能是""的一部分(关联,绑定)Example类。创建未绑定的函数也是可能的(并且相当常见)。通常,在Python中,未绑定的函数很简单,称为"函数"而那些属于一个阶级的人被称为"方法" ......或"实例函数。"
  • 类是用于实例化对象的模板。术语"实例"和"对象"在这种情况下是同义词。你的例子" test"是一个实例......和Python解释器"实例化"并根据类描述初始化该对象。
  • 类也是"类型",也就是说它是一种数据类型及其相关方法的用户定义。 "类"和"键入"虽然它们通常以不同的方式使用,但它们在Python中有点同义。核心"类型" Python数据(整数,实数,虚数/复数,字符串,列表,元组和字典)都被称为"类型"而更复杂的数据/操作结构称为类。 Python的早期版本使用约束来实现,这些约束区分了" type"和"班"不仅仅是术语上的差异问题。但是,最后几个版本的Python已经消除了那些潜在的技术差异。这些区别与"子类化"有关。 (继承)。
  • 类可以描述为对另一个类的一组添加和修改。这被称为"继承"以这种方式从另一个派生的类被称为"子类。"程序员创建类的层次结构很常见......具体的变化都来自更常见的基础。在相同文件或文件集中定义相关功能也很常见。这些是"类库"有时它们被构建为"包。"
  • _init_ ()是一种方法;特别是它是Python对象(类的实例)的初始化器。
  • Python通常使用 _..._ (在所选关键字周围添加下划线字符的前缀和后缀)来表示"特殊"方法或属性名称...旨在降低其命名选择与您可能希望为自己的方法提供的有意义名称冲突的可能性。虽然您可以使用此 _XXXX_ 命名其他方法和属性---但Python本身并不会将其视为错误 - 这样做是一个非常糟糕的主意。即使您没有选择任何当前定义的特殊名称,也不能保证未来某个版本的Python不会在以后与您的使用发生冲突。
  • "方法"是函数......但它们是一种与特定类的特定实例绑定(关联)的函数。还有"类方法"它与类相关联,而不是与类的特定实例相关联。
  • 在你的例子中,self.b,self.c等等是"属性"或"成员"对象(实例)。 (这些术语是同义词)。
  • 一般而言,面向对象编程的目的是提供以适合人类理解和计算机化解释和执行的方式描述这些类型数据的数据类型和操作的方法。 (所有编程语言都旨在在人类可读性/理解力和机器解析/执行之间取得一些平衡;但是面向对象的语言专门针对"类型的描述和定义而这样做,"以及将这些类型实例化为"对象"以及最终这些对象之间的各种交互。
  • "自"是一种Python特定约定,用于为任何绑定方法命名特殊(通常是必需的)第一个参数。它是一个" self" reference(一种方法中的代码用于引用对象/实例的自身属性和其他方法而没有任何歧义的方法)。虽然你可以用你的约束方法调用你的第一个参数" a" (正如你在你的例子中不知不觉地做的那样)这样做是一个非常糟糕的主意。它不仅会在以后让您感到困惑......对于其他试图阅读您的Python代码的人来说也没有任何意义。)
  • 术语"面向对象"除非人们意识到与其他形式的编程语言的比较,否则会令人困惑。这是一个从程序性的过程中演变而来的#34;节目。这种比较最简单的要点是当你考虑过程语言中定义的各种函数时,人们可能必须定义并分别命名不同的函数来对不同类型的数据执行类似的操作:print_student_record(this_student)vs。print_teacher_report( some_report)---一种编程模型,它需要程序员的相当大的开销,以跟踪哪些函数适用于哪些类型。在OO(面向对象)编程中消除了这种问题,其中可以想象,可以调用this.print_()...并且,假设有人创建了兼容的类,这将" print"无论是否"这"是学生(记录/对象)或教师(报告/记录/对象)。这非常简单,但有助于理解导致开发和采用基于面向对象程序的压力。
  • 在Python中,可以创建功能很少或没有功能的类。你的例子什么也没做,但是,将一组参数转移到"属性" (成员)在初始化(实例化)期间。之后,您可以在编程语句中使用这些属性,例如: test.a + = 1 print(test.a)。这是可能的,因为Python是一个多范式"语言。它支持程序和面向对象的编程风格。以这种方式使用的对象非常类似于"结构"从C编程语言(C ++的前身)到"记录"这种编程风格在很大程度上被认为是过时的(特别是当使用现代的,非常高级的语言,如Python)时。

我所得到的要点就是......你想要学习如何将你的数据视为它的组合部分" (属性)以及更改,操作,验证和处理这些属性的输入,输出和可能存储的功能。

例如,如果您正在编写"代码断路器"程序来解决简单的密码你可能会实现一个"直方图"计算给定编码消息的字母频率的对象。这将具有属性(每个字母一个整数)和行为(将编码消息的端口馈送到实例中,将字符串拆分为单个字符,过滤掉所有非字母字符,将所有字母转换为上部或小写,并计算它们 - 即递增对应于每个字母的整数)。另外,您需要有一些方法来查询直方图...例如,在密文中获取按频率排序的字母列表。

一旦你有了这样的"直方图"那么你可以想办法将它用于你的求解器。例如,为了解决密码难题,您可以计算直方图,然后尝试替换" etaon"对于五个最常见的加密字母...然后检查有多少"部分"字符串(t.e表示"")匹配单词,尝试排列等等。这些中的每一个都可能是它自己的类。编程的一个关键点是你的直方图类可能对计算各种其他事物很有用(即使在简单的投票系统或流行度环境中)。特定的子类或实例化可能使其成为字母的直方图,而其他子类或实例可以重新用于其他类型的事物"你想要数。类似地,迭代某些列表的permutions的代码可以用于任何数量的模拟,优化和相关程序。 (事实上​​,Python的标准库已经包括"计数器"以及"排列""集合"和#34; itertools"模块中的功能,分别)。

当然,在学习编程时,你会反复听到所有这些概念。这是一个相当漫无边际的尝试,以启动这一进程。我知道我在这里有点重复 - 其中一部分是因为我在昨天早上7点开始上班后的凌晨4点打字了。但其中一部分也有教学目的。

答案 1 :(得分:1)

您的班级定义中存在错误。 始终self方法中包含变量__init__。它表示对象本身的实例,应作为所有方法的第一个参数包含在内。

这门课你想完成什么?到目前为止,它只存储了一些变量。尝试添加一些方法来增加一些东西! Python中的类有很多可用资源。首先,你可能想尝试一下这个:

Python Programming - Classes

答案 2 :(得分:0)

我现在也在学习python,并且在codecademy.com上有一个非常好的介绍类

http://www.codecademy.com/tracks/python

它有一个部分,通过课程练习。希望这有帮助