python面向对象相关知识(二)

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() ## 已转化为此函数名

猜你喜欢

转载自blog.csdn.net/kong2030/article/details/81436462