面向对象编程的基本思想
类和实例
类用于定义抽象类型
实例根据类的定义创建出来
python 定义类并创建实例
在python 中,通过class 关键字定义,以Person 为例
定义一个person 类如下:
class Person(object):
pass
python 创建实例属性
如何让每个实例拥有各自不同的属性。
xiaoming = Person()
xiaoming.name = 'Xiao Ming'
xiaoming.gender = 'Male'
xiaoming.birth = '1990-1-1'
xiaohong = Person()
xiaohong.name = 'Xiao Hong'
xiaohong.school = 'No. 1 High School'
xiaohong.grade = 2
python 初始化实例属性
如何让Person 类在创建的时候就拥有name gender 和 birth 属性。
在定义Person 类时,可以为Person 类添加一个特殊的 _init_()
都统一加以下属性:
class Person(object):
def_init_(self,name,gender,birth):
self.name = name
self.gender = gender
self.birth = birth
__init__()方法的第一个参数必须是self(也可以用别的名字,
相应的,创建实例时,就必须提供除self 以外的实例
xiaoming = Person('Xiao Ming','Male','1991-1-1')
xiaohong = Person('Xiao Hong','Female','1992-2-2')
有了__init__()方法,每个Person实例在创建时,都会有name、gender
print xiaoming.name # 输出 'Xiao Ming'
print xiaohong.birth # 输出 '1992-2-2'
python 中访问限制
部访问到怎么办?
性由双下划线开头(__),该属性就无法被外部访问。看例子:
class Person(object):
def __init__(self,name):
self.name = name
self.title = 'Mr'
self.__job = 'Student'
p = Person('Bob')
print p.name
Bob
print p._title
Mr
print p.__job
Error
python 创建类属性
类是模板,而实例则是根据类创建的对象。
绑定在一个实力上的属性不会影响其他实例,但是类本身是一个对象。
各自拥有,互相独立,而类属性有且只有一份。
定义类可以直接在class 中定义
class Person(object):
address = 'Earth'
def __init__(self,name):
self.name = name
Person.address = 'China'
print p1.address
‘China’
因为类属性只有一份,所以,当Person类的address改变时,
所有实例访问到的类属性都改变了。
python 中定义实例方法
函数完全一样的。
class Person(object):
def __init__(self,name):
self._name = name
def get_name(self):
return self._name
et_name(self)就是一个实例方法,它的第一个参数是self
。__init__(self,name)其实也可看做是一个特殊的实例方法。
p1 = Person('Bob') print p1.get_name() # self不需要显式传入 # => Bob
是一个函数对象。
class Person(object):
def __init__(self,score):
self.name = name
def get_grade(self):
return 'A'
python 中定义类方法
是实例本身。
在class 中定义类方法,需要这么些。
class Person(object):
count = 0;
@class smethod
def how_many(cls):
return cls.count
def __init__(self,name):
self.name = name
Person.count = Person.count + 1
print Person.how_many()
p1 = Person('Bob')
print Person.how_many()
而非类的实例。类方法的第一个参数将传入类本身,通常将
参数名命名为cls,上面的cls.count实际上相当于Person.count。