[Python进阶-3]面向对象,类,实例,属性,方法,类属性,类方法,内部属性

(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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值