一、类和对象
根据操作数据的函数或语句块来设计程序的称为面向过程的编程。 把数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法。这种方法称为面向对象的编程理念。
类和对象是面向对象编程的两个主要方面。
类创建一个新类型,而对象这个类的实例。这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象)。
对象可以使用普通的属于对象的变量存储数据。对象也可以使用属于类的函数来具有功能。这样的函数被称为类的方法。这些术语帮助我们把它们与孤立的函数和变量区分开来。
属于一个对象或类的变量被称为域。域和方法可以合称为类的属性。
A、类的举例说明 class Person:
pass # An em pty block p = Person() print p
(1) 使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。 (2) 接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。打印出这个变量的类型。说明已经在__main__模块中有了一个Person类的实例
(3) 在类中的所有东西都要缩近,就像位于函数、if 语句,for循环,诸如此类的代码。第一条不缩近的东西不属于这个类。 B、使用对象的方法 class Person:
def sayHi(self ):
print ' Hello, how are you?' p = Person() p.sayHi()
注意self的用法。注意sayHi方法没有任何参数,但仍然在函数定义时有self。
二、self
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,调用这个方法的时候不为其参数赋值,Python会提供这个值。这
个特别的变量指对象本身,惯例它的名称是self。
Python如何给self赋值说明:假如一个类称为MyClass和这个类的一个实例MyObject。当调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1,arg2)——这就是self的原理了。即意味着若有一个不需要参数的方法,仍需要给该方法定义一个self参数。
三、__init __方法
__init __方法在类的一个对象被建立时,马上运行。用来对你的对象做一些你希望的初始化,举例如下。 class Person:
def __init __(self , name): self.name = name def sayHi(self ):
print ' Hello, my name is' , self.name p = Person(' Swaroop' ) p.sayHi()
工作说明:把__init __方法定义为取一个参数name(以及普通的参数self)。在这个__init __里,只是创建一个新的域,即name。注意它们是两个不同的变量,尽管它们有相同的名字。点号使我们能够区分它们。最重要的是,没有专门调用__init __方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给__init __方法。 何时去使用self和 __ init__?
当定义你自已的类方法时,必须明确将self作为每个方法的第一个参数列出,包括 __init__ 。当从类中调用一个父类的一个方法时,必须包括 self参数。但当从类的外部调用类方法时,不必对self 参数指定任何值;完全将其忽略,而Python 会自动地替你增加实例的引用。
__init__ 方法可以接受任意数目的参数,就像函数一样,参数可以用缺省值定义,即可以设置成对于调用者可选。在本例中, filename 有一个缺省值None ,即 Python 的空值。
__init__ 方法是可选的,但是一旦你定义了,就必须记得显示调用父类的 __init__ 方法 (如果它定义了的话)。这样更是正确的:无论何时子类想扩展父类 的行为,后代方法必须在适当的时机,使用适当的参数,显式调用父类方法。 注意: __init__ 方法从不返回一个值。
四、类与对象的方法
讨论了类与对象的功能部分,现在看一下它的数据部分。它们只是与类和对象的名称空间绑定的普通变量,即这些名称只在这些类与对象的前提下有效。 有两种类型的域 ——类的变量和对象的变量,它们根据是类还是对象拥有这个变量而区分。
类的变量由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。
对象的变量由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷贝,即它们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。举例如下: class Person:
' ' ' Represents a person. ' ' ' population = 0
def __init __(self , name):
' ' ' Initializes the person' s data. ' ' ' self.name = name
print ' (Initializing % s)' % self. name # When this person is created, he/she # adds to the population Person.population += 1 def __del __(self ): ' ' ' I am dying. ' ' '
print ' % s says bye. ' % self. name Person.population -= 1 if Person.population == 0: print ' I am the last one. ' else:
print ' There are still % d people left . ' % Person.population def sayHi(self ):
' ' ' Greeting by the person.Really, that's all it does. ' ' ' print ' Hi , my name i s % s. ' % self.name def howMany(self ):
' ' ' Print s the current population. ' ' ' if Person.population == 1:
print ' I am the only person here. ' else:
print ' W e have % d persons here. ' % Person.population swaroop = Person(' Swaroop' ) swaroop. sayHi () swaroop. howMany()
kalam = Person(' Abdul Kal am ' ) kalam.sayHi()
kalam. howMany() swaroop.sayHi() swaroop. howMany() 输出
$ python objvar. py (Initializing Swaroop) Hi , my name is Swaroop. I am the only person here. (Initializing Abdul Kalam ) Hi , my name is Abdul Kalam . We have 2 persons here. Hi , my name is Swaroop. We have 2 persons here. Abdul Kalam says bye. There are still 1 people left . Swaroop says bye. I am the last one.
工作分析:population属于Person类,是一个类的变量。name变量属于对象(它使用self赋值)因此是对象的变量。
观察可以发现__init __方法用一个名字来初始化Person实例。在这个方法中,让population增加1,是因为增加了一个人。同样可以发现,self.name的值根据每个对象指定,这表明了它作为对象的变量的本质。
只能使用self变量来参考同一个对象的变量和方法。这被称为属性参考。 在这个程序中,还看到docstring对于类和方法同样有用。在运行时使用Person. __doc__和Person. sayHi . __doc__来分别访问类与方法的文档字符串。就如同 __init __方法一样,还有一个特殊的方法__del __,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。在这个方法里面,只是简单地把Person.population减1。
当对象不再被使用时,__del __方法运行,但是很难保证这个方法究竟在什么时候运行。如果想要指明它的运行,就得使用del语句。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务