1、类
定义:
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
重点:
__init__():构造函数
必须继承,实在没有就object
方法定义中的形参第一个必须是self,表示自身
__arg开头的变量表示私有变量,相当于private,只能内部可以访问,原因是解释器解析成_Student__name,可以通过这个变量名访问
__arg__特殊变量,是可以直接访问的
2、变量与函数
class Animal(object):
##类变量
are = "china"
##无参构造函数,定义类时默认存在,自己定义会覆盖
def __init__(self):
self.name = "default" ##实例变量
self.age = 18
##有参构造函数,无重载功能,相同方法名,后定义会覆盖前定义的方法
def __init__(self,name,age):
self.name = name
self.age = age
##实例方法,第一个参数默认是实例自身,一般以self命名,可以换成另外的变量名
def instancemethod(self):
print "this is instancemethod"
##静态方法
@staticmethod
def staticmethod():
print "this is staticmethod"
##类方法,第一个参数默认类自身,一般以cls命名
@classmethod
def classmethod(cls):
print "this is classmethod"
##Animal.instancemethod() ##会报错,因为是实例方法
Animal.staticmethod() ##可以直接调用静态方法
Animal.classmethod() ##可以直接调用类方法
print Animal.are ##可以直接调用类变量
a = Animal("dog",18) ##调用有参构造函数
a.instancemethod() ##需要先新建实例,方能调用实例方法
3、@staticmethod和@classmethod的区别
class Animal(object):
are = "china"
@staticmethod
def staticmethod():
print Animal.are ##调用类变量
print "this is staticmethod"
@classmethod
def classmethod(cls):
print cls.are ##调用类变量
print "this is classmethod"
Animal.staticmethod() ##直接使用类名调用
Animal.classmethod() ##直接使用类名调用
print Animal.are
相同点:都不需要实例化,直接使用 类名.方法名 调用
不同点:类方法(@classmethod)会带有表示类自身的参数cls,当需要调用类的相关属性、方法时,使用 cls.方法名/变量名 调用即可,避免硬编码;而静态方法(@staticmethod)调用类相关的属性、方法时,需要使用 类名.方法/变量 方式调用,当类名改变时这里跟随改变。
4、私有变量与私有函数
python中成员函数与成员变量默认都是公开的,并无像java一样的关键字private/public来标识私有与公有,但提供另外一种方式,在变量或函数前面加上双下划线 _ _ 来表示私有,其实并不是严格上的私有,只是通过某种机制把前面带双下划线的变量名在内部转化为 _ 类名_ _变量名
class Animal(object):
__age = 18 ## 私有变量
def __getAge(self): ## 私有函数
print self.__age
##print Animal.__age ## 报错,无此变量
print Animal._Animal__age ## 已转化为此变量名
##Animal().__getAge() ## 报错,无此函数
Animal()._Animal__getAge() ## 已转化为此函数名