类的定义:
我们选用的第一个建模现实世界里的问题是创建一份通信录。
要在Python里创建一个类,你需要提供class关键字,这个心的类的名字,
以及一个或多个基类(base class)
例如,如果要创建一个Car(轿车)或是Trunk(卡车)类的话,你可以用Vehicle作为一个基类。
如果你不想从任何现有类继承的话,只需使用Python的根(root)类或类型object作为你的基类
class AddressBookEntry(object):
version=0.1
def __init__(self,name,phone):
self.name=name
self.phone=phone
s=AddressBookEntry('aa','bb')
print s
print s.name
print s.phone
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/Django/a7.py
<__main__.AddressBookEntry object at 0x02037E30>
aa
bb
class AddressBookEntry(object):
version=0.1
def __init__(self,name,phone):
self.name=name
self.phone=phone
def update_phone(self,phone):
self.phone=phone
s=AddressBookEntry('aa','bb')
print s
print 's.name'+' '+s.name
print 's.phone'+' '+s.phone
print '-------------'
s.update_phone('cc')
print 's.phone'+' '+s.phone
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/Django/a7.py
<__main__.AddressBookEntry object at 0x02146330>
s.name aa
s.phone bb
-------------
s.phone cc
version这样类的静态成员的(Static class member)的创建时通过在类定义里赋值完成的。
这样的成员就是属于类的变量,可以在所有时间之间共享。
方法(method)的定义和函数一样,就是每个方法都必须带上一个额外的self对象---Python在这一点上非常明确。
变量self 指向的是类的一个特定的实例(在其他语言里用this来代表这个slef的概念)
class AddressBookEntry(object):
version=0.1
def __init__(self,name,phone):
print self
self.name=name
self.phone=phone
def update_phone(self,phone):
self.phone=phone
s=AddressBookEntry('aa','bb')
print s
print 's.name'+' '+s.name
print 's.phone'+' '+s.phone
print '-------------'
s.update_phone('cc')
print 's.phone'+' '+s.phone
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/Django/a7.py
<__main__.AddressBookEntry object at 0x02276330>
<__main__.AddressBookEntry object at 0x02276330>
s.name aa
s.phone bb
-------------
s.phone cc
变量self指向的是类的一个特定的实例(在其他语言里用this来代表这个self的概念)
一个在执行过程中创建出来让你操作的真实对象。
所有以self开头以及点--属性形式出现的变量都是一个实例属性,即一个属于特定实例的对象。
如果你有使用其他面向对象特性语言的经验的话,奇怪注意Python没有构造函数和析构函数的概念
实例化:
其他语言一般都使用new语句来创建实例,不过Python里你只要像调用函数一样调用类的名字就可以了。
Python 用的是"初始化程序"而不是构造函数。
所以名字用的也是__init__,在实例化一个对象时,你需要传入__init__所需的参数。
在Python在创建对象时会用你提供的参数自动调用__init__,并最终返回将一个新创建的对象返回给你。
我们说的调用方法,不过其实也完全可以说是函数调用。虽然你在方法声明里被要求提供self参数
class AddressBookEntry(object):
version=0.1
def __init__(self,name,phone):
print self
self.name=name
self.phone=phone
john=AddressBookEntry('John Doe','408-555-1212')
print john
print '---------------------'
jane=AddressBookEntry('Jane Doe','650-555-1212')
print john
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/Django/a8.py
<__main__.AddressBookEntry object at 0x022C6350>
<__main__.AddressBookEntry object at 0x022C6350>
---------------------
<__main__.AddressBookEntry object at 0x022C6370>
<__main__.AddressBookEntry object at 0x022C6350>
Python会为每个实例调用__init__,随后返回这个对象。仔细看,这里并没有在调用时给出self,
只有name和phone number,Python会为你传入self的。
现在你就可以直接访问属性了,比如john.name,john.phone,jane.name和jane.phone
class AddressBookEntry(object):
version=0.1
def __init__(self,name,phone):
print self
self.name=name
self.phone=phone
def update_phone(self,phone):
self.phone=phone
再次强调一下,注意这里的update_phone方法实际上有两个参数,self和newphone.
但是我们只需要提供新的phone number就可以了,Phone会自动将指向john的实例对象作为self传递进来