Python 类(二)

上一次小测试的参考答案如下:

没有做出来,不怪你,因为我们才刚刚学了一点皮毛。但是今天学完了,再练习,以后类似题目就简单了。

今天测试题:

Question6

Level2

Question:

Write aprogram that calculatesandprints the value according to the given formula:

Q=Squareroot of[(2*C*D)/H]

Following are the fixed values of CandH:

Cis50.His30.

Disthe variable whose values should beinputto your programina comma-separated sequence.

写一个程序,根据给定的公式计算并打印值,公式Q = [2*C*D/H] 这个式子的平方根,C = 50,H = 30,D是input函数从键盘输入的值。假如我们只是输入3个值,分别是100,150,180.结果应该是18,22,24.

要求:如果结果是带小数点的浮点数,应该取整。

已经是第二个level水平了,稍微难一点,多尝试尝试吧。

今天找了一个系统但相对简单的英文材料,来系统学习类的定义等有关内容,我在原文翻译的基础上,适当加上了自己的注解和说明,总体应该是相当权威的。请一次性学好。

面向对象编程

我们迄今学习的编程,是围绕着函数(换句话说,就是一代码块),来操作数据的。这个叫做面向过程编程。还有一种组织程序的方法,它将数据和函数结合起来,并放入叫做对象的代码里。这叫做面向对象编程范式。大多数时间你都可以用面向过程编程,但如果你编写大型程序,或者你编程时遇到的问题更适合这种方法,你可以使用面向对象的编程技术。

类和对象是面向对象编程的两个重点,一个类创建一个新的类型,类的对象就是这个类的实例。可以这样类比,你有“int”类型的变量,也就是说你的变量名指向的整数,其实就是 int 类的实例(对象)。

在类的定义中,变量属于对象或者属于类。被称为fields(有人翻译成字段,在这个时点上,直接记英文最佳),类里面的函数被称为类的方法,这些术语很重要,因为它能使类中的他们与类外独立的变量和函数相区别。还有,总体上,fields和方法被称为类的attributes(多数人翻译成属性,鼓励你直接记英文)

Fields有两种,一种属于类的实例/对象的,另一种属于类本身。(方法,在这个时点上,暂时不分类),因此分别称为实例变量和类变量。

一个类用 class 关键字定义,fields和方法都在类的里面,当然,代码块是缩进的。

Self:类中的方法与外面的普通函数的区别,它有一个特殊的形式参数,放在其他参数前面,但当你调用这个方法时,你不用传值给它。Python自身提供给它。这个特殊的变量参数就是将要创建的对象本身,传统上,我们用 self表示。你可以用其他名字表示,但请尊重传统,因为他人会阅读你的代码。然而C++,Java等却沿用他们的传统用了this这个词。

我们举例,假设有一个类叫做MyClass, 它的一个实例叫做myobject. 当你调用方法时,也就是调用下面的方法(函数):

myobject.method ( arg1, arg2 );

在Python里面这个方法就会自动变成

MyClass.method ( myobject, arg1, arg2),

这就是self的作用。当方法没有实参时,其实仍然有一个实参,它就是self.

下面是一个最简单的类定义和对象创建的例子。

Class Person:

pass

p = Person()

print(p)

务必试验一下,看是否有输出。

我们使用class语句,类名创建了一个新的类,然后紧随其后的是缩进的代码块,形成了类的主体。在这个例子中,我们用pass语句代表空的代码块。接着我们创建了这个类的实例/对象,用的是Person()方法,后面我们会详细讲解这个方法。请注意是方法,Person 在这里代表的是一种方法,叫做构造方法。

最后打印,输出的是。。。看看你自己的输出。

打印结果显示,我们有一个在内存中某某地址的Person类的实例。当然还有一个东西,main前后有两个下划线,以后讲两个下划线的事。

注意,不同计算机打印的地址是不同的,因为Python是自己找空间存储对象的。

方法

我们已经讨论过类/对象可以有方法,这个方法和函数是一样的,但有一个额外的self参数变量。我们举例:

Class Person:

def sayHello(self):

Print ( “Hello, How are you?” )

P2 = Person( )

P2.sayHello( )

请自行测试

init方法

一旦类开始实例化(创建)对象,这个init方法就会被调用,此方法用来初始化(将最初值传给你的对象叫做初始化),请注意,其前后分别有两个下划线。

举例:

class Person:

def __init__(self, name):

self.name = name

def sayHi(self):

print(“Hello, my name is “, self.name)

p3 = Person(“Tom”)

p3.sayHi()

以上我们定义了形式参数name(与self一起),然后我们创建了一个同名的field (name). 请注意,这个name和参数name 是两个东西,尽管名字一样。self.name 中间有“点”连接,并且这意味着其中一部分叫做name,一部分叫做self, 是个local变量。和参数name不要混淆。

当创建Person类的p3实例时,我们用类名加括号和括号内的实参来创建,其实就是调用了init这个方法。这个有点特别,请注意。P3对象创建后,就可以用点来调用sayHi( )方法了。

类与对象变量

我们现在看看数据部分,fields字段其实就是普通变量。他们绑定在类和对象的命名空间中,(命名空间先望文生义吧,如果你不知道),这意味着这些名字仅仅在类和对象的区间内有效。前面已经提到有两种fields,类变量和对象变量(其实大多数中文书中,喜欢叫属性,或成员属性),这种分类的依据是,谁拥有这个变量。

类变量:共享,被所有类实例访问,只有一个copy,所以,如果一个对象改变了类变量,当其他对象访问时,就只能看到改变后的变量了。

对象变量:每个类对象/实例自己拥有自己的变量。并不共享,也不关联即使他们在不同的实例中有相同的名字。

下面是个较大的例子,作为我们今天讨论的结束。代码后面会有解释。

解释:

1.poulation属于 Robot 类的 field, 所以叫做类变量;

2.name前面有 self,并且在构造方法内,显然属于对象/实例变量;

3.所以,我们会使用 Robot.population ; self.name ; 当然,我们可以这么用,self.__class__.population ;

4.print ( “…” . format( ) )是一种格式化打印,先模仿学习。

5.howMany在这里是类的方法,不是实例/对象的;它的上头是个叫做decorator的东西,这样howMany方法就成了类方法,这个只能以后专门讨论。

6.其他的就自己先琢磨。

看运行结果。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190130G15R3600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券