(1)这里在复习一下排序的简单写法,按照对象的name进行排序:
class Person(object):
pass
p1 = Person()
p1.name = 'Bart'
p2 = Person()
p2.name = 'Adam'
p3 = Person()
p3.name = 'Lisa'
L1 = [p1, p2, p3]
L2 = sorted(L1,lambda p1,p2:cmp(p1.name,p2.name))
print L2[0].name
print L2[1].name
print L2[2].name
(2)类对象的共有属性的定义用init(self,xxx,xxx,,,)。这个大家都知道。
——第一个参数是传入实例引用的参数,最好用惯例的self,当然也可以用其他的。
——关键字参数的使用,如下,类似于字典dict。
class Person(object):
def __init__(self,name,gender,birth,**kw):
self.name=name
self.gender=gender
self.birth=birth
for k,v in kw.iteritems():
setattr(self,k,v)
xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
print xiaoming.name
print xiaoming.job
(3)如果一个属性不想被外部访问,那么这个属性可以用双下划线开头__:
class Person(object):
def __init__(self, name, score):
self.name=name
self.__score=score
p = Person('Bob', 59)
print p.name
print p.__score//不可访问
(4)类也有自己的属性。类属性可以被类直接访问,也可以被每个实例访问。如下面的count就是类属性。
class Person(object):
count=0
def __init__(self,name):
self.name=name
Person.count+=1
p1 = Person('Bob')
print Person.count
p2 = Person('Alice')
print Person.count
p3 = Person('Tim')
print Person.count
(5)接上文,既然这个类属性,大家都能访问,那万一修改了怎么办?
——如果是类进行类属性修改,那么类和实例访问时值都会改变。
——如果是某个实例修改类属性,那么只有这个实例访问时会发现值变化,其他的实例和类访问都不变,原因:其实,这个实例修改时,并没有修改类属性值,只是自己创建了一个实例属性,这样类和其他实例访问类属性时,肯定是不变的。这个实例自己访问的时候其实访问的是自己的实例属性,这个实例属性和类属性同名而已。所以另一个特点:当实例和类有相同属性时,优先访问实例属性,如果实例没有某个属性,那么就会访问类属性,如果都没有,就报错。
class Person(object):
address = 'Earth'
def __init__(self, name):
self.name = name
p1 = Person('Bob')
p2 = Person('Alice')
print 'Person.address = ' + Person.address
#Person.address = Earth
p1.address = 'China'
print 'p1.address = ' + p1.address
#p1.address = China
print 'Person.address = ' + Person.address
#Person.address = Earth
print 'p2.address = ' + p2.address
#p2.address = Earth
(6)上文说道用__xxx表示类的内部属性,外部实例不能访问,那么如果要访问怎么办?只能通过定义的实例方法来访问:
class Person(object):
def __init__(self, name, score):
self.name=name
self.__score=score
def get_grade(self):
if self.__score>85:
return 'A'
elif self.__score>60:
return 'B'
else:
return 'C'
p1 = Person('Bob', 90)
p2 = Person('Alice', 65)
p3 = Person('Tim', 48)
print p1.get_grade()
print p2.get_grade()
print p3.get_grade()
(7)类方法。用@classmethod定义
class Person(object):
__count = 0
@classmethod
def how_many(cls):
return cls.__count
def __init__(self,name):
Person.__count+=1
self.name=name
print Person.how_many()#0
p1 = Person('Bob')
print Person.how_many()#1