面向对象——python核心编程第二版

python

类与实例

类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象
的具体信息。



class MyData(object):
  pass



>>> mathObj = MyData()
>>> mathObj.x = 4
>>> mathObj.y = 5
>>> mathObj.x + mathObj.y
9
>>> mathObj.x * mathObj.y
20



可以使用类作为名字空间容器
mathObj.x 和 mathObj.y 是实例对象独有的属性,因为它们不是类 MyData 的属性。

方法
class MyDataWithMethod(object): # 定义类
  def printFoo(self): # 定义方法
    print \'You invoked printFoo()!\'




>>> myObj = MyDataWithMethod() # 创建实例
>>> myObj.printFoo() # 现在调用方法
You invoked printFoo()!



 

pytyhon中,特殊的方法__init__() ,不是构造器。只是实例化过程中执行的方法。

class AddrBookEntry(object): # 类定义
  \'address book entry class\'
  def __init__(self, nm, ph): # 定义构造器
    self.name = nm # 设置 name
    self.phone = ph # 设置 phone
    print \'Created instance for:\', self.name
  def updatePhone(self, newph): # 定义方法
    self.phone = newph
    print \'Updated phone# for:\', self.name


在 调用AddrBookEntry()实例化/创建实例时,AddrBookEntry()的参数完全与__init__()接收到的参数是一样(除了__init__中的self被自动传递) ,都是nm,ph


创建实例(实例化)

self被自动传递,使用时,可以忽略
>>> john = AddrBookEntry(\'John Doe\', \'408-555-1212\') #为 John Doe 创建实例
>>> jane = AddrBookEntry(\'Jane Doe\', \'650-555-1212\') #为 Jane Doe 创建实例





>>> john
<__main__.AddrBookEntry instance at 80ee610>
>>> john.name
\'John Doe\'
>>> john.phone
\'408-555-1212\'
>>> jane.name
\'Jane Doe\'
>>> jane.phone
\'650-555-1212



方法调用(通过实例)

self被自动传递,使用时,可以忽略
>>> john.updatePhone(\'415-555-1212\') #更新 John Doe 的电话
>>> john.phone
\'415-555-1212\'



创建子类
指对新类的改动不会影响到原来的类


class EmplAddrBookEntry(AddrBookEntry):
\'Employee Address Book Entry class\'#员工地址本类
def __init__(self, nm, ph, id, em):
AddrBookEntry.__init__(self, nm, ph)
self.empid = id
self.email = em
def updateEmail(self, newem):
self.email = newem
print \'Updated e-mail address for:\', self.nam




python推荐的命名方式  

类名,使用大写开头的驼峰法,例如:

AddrBookEntry,RepairShop


数据属性,使用名词 ,小写,例如:

name,phone,email 

方法名,使用动词,骆驼记法的下划线方式 ,例如:

update_phone,update_email

 

面向对象设计与面向对象编程的关系

尽管它从一开始设计就是面向对象的,并且结构上支持 OOP,但Python 没有限定或要求你在你的应用中写 OO 的代码。


类的数据属性:

注意以下并不需要创建对象,即可调用。

>>> class C(object):
... foo = 100
>>> print C.foo
100
>>> C.foo = C.foo + 1



>>> print C.foo
101



 方法:

这里,myNoActionMethod 是通过句点属性标识法与它的实例绑定的。
>>> class MyClass(object):
def myNoActionMethod(self):
pass
>>> mc = MyClass()
>>> mc.myNoActionMethod()



 

 

 

 

>>> dir(MyClass)
[\'__doc__\', \'__module__\', \'showMyVersion\', \'myVersion\']

>>> MyClass.__dict__
{\'__doc__\': None, \'myVersion\': 1, \'showMyVersion\':
<function showMyVersion at 950ed0>, \'__module__\':
\'__main__\'}
从上面可以看到, dir()返回的仅是对象的属性的一个名字列表, 而__dict__返回的是一个字典,
它的键(keys)是属性名,键值(values)是相应的属性对象的数据值。

 

C.__name__ 类C的名字(字符串)
C.__doc__ 类C的文档字符串
C.__bases__ 类C的所有父类构成的元组
C.__dict__ 类C的属性
C.__module__ 类C定义所在的模块(1.5 版本新增)
C.__class__ 实例C对应的类(仅新式类中)

 

 

 

实例属性
实例仅拥有数据属性(方法严格来说是类属性),后者只是与某个类的实例相关联的数据值,并
且可以通过句点属性标识法来访问。这些值独立于其它实例或类。当一个实例被释放后,它的属性
同时也被清除了。



以上是 面向对象——python核心编程第二版 的全部内容, 来源链接: utcz.com/z/387428.html

回到顶部