类
在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