Python2笔记(八)—— 类和对象

在Python中,类通过 class 关键字定义。类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。创建实例使用 类名+(),类似函数调用的形式创建;

# -*- coding: utf-8 -*-
class Person(object):
    pass


user1 = Person()
user1.name = 'Xiao Ming'
user1.gender = 'Male'
user1.birth = '1990-1-1'

print user1.birth

结果:

1990-1-1

由于Python是动态语言,对每一个实例,都可以直接给他们的属性赋值;

__init__()

初始化实例时默认创建一些属性

# -*- coding: utf-8 -*-
class Person(object):
    def __init__(self, name, gender, birth):
        self.name = name
        self.gender = gender
        self.birth = birth

私有属性

如果一个属性由双下划线开头(__),该属性就无法被外部访问。

但是,如果一个属性以"__xxx__“的形式定义,那它又可以被外部访问了,以”__xxx__“定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用”__xxx__"定义。

类属性:

类是模板,而实例则是根据类创建的对象。

绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份

# -*- coding: utf-8 -*-
class Person(object):
    address = 'Earth'

    # def __init__(self, name, gender, birth):
    #     self.name = name
    #     self.gender = gender
    #     self.birth = birth

    def __init__(self, name):
        self.name = name


user1 = Person('user1')
print user1.address

user2 = Person('user2')
print user1.address

结果:

Earth
Earth

当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

实例的方法

实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的;

# -*- coding: utf-8 -*-
class Person(object):
    address = 'Earth'

    # def __init__(self, name, gender, birth):
    #     self.name = name
    #     self.gender = gender
    #     self.birth = birth

    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name


user1 = Person('user1')
print user1.get_name()

结果:

user1

因为方法也是一个属性,所以,它也可以动态地添加到实例上,只是需要用 types.MethodType() 把一个函数变为一个方法:

# -*- coding: utf-8 -*-
import types


def fn_get_age(self):
    return self.age


class Person(object):
    address = 'Earth'

    # def __init__(self, name, gender, birth):
    #     self.name = name
    #     self.gender = gender
    #     self.birth = birth

    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name


user1 = Person('user1')
user1.age = 12
print user1.get_name()
# 将fn_get_age动态添加到user1的get_age属性上
user1.get_age = types.MethodType(fn_get_age, user1, Person)
print user1.get_age()

结果:

user1
12

类方法

和属性类似,方法也分实例方法和类方法。

# -*- coding: utf-8 -*-


class Person(object):
    class_name = 'Name:Person'

    @classmethod
    def get_class_name(cls):
        return cls.class_name


print Person.get_class_name()

结果:

Name:Person

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值