python中各种属性与方法深析

在了解类的继承之后,我们需要特别知道以下几个概念及其具体使用:

(1)私有属性;

(2)私有方法;

(3)类属性;

(4)类方法;

(5)静态方法;

注意:python在类中没有声明的话,所有的方法都是公有方法,所有的属性都是公有属性.

一.私有属性和私有方法

私有属性和私有方法应用场景及定义方式

应用场景:

在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到

私有属性就是对象不希望公开的属性

私有方法就是对象不希望公开的方法

定义方法:

在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法

实例演练:

class Women():

    def __init__(self,name):           --初始化方法也是私有方法

        self.name = name

        self.__age = 18                --定义age为私有属性

    def ___secret(self):               --定义secret为私有方法

        print '%s 的年龄是 %d' % (self.name,self.__age)

lily = Women('lily')

# 私有属性,在外界不允许直接访问

print lily.age

# 私有方法,外界不允许直接访问

lily.secret()

python中各种属性与方法深析

父类的私有属性和私有方法

1.子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法

2.子类对象可以通过父类的公有方法间接访问到私有属性或私有方法

私有属性和私有方法是对象的隐私,不对外公开,外界以及子类都不能直接访问

私有属性,私有方法常用做一些内部的事情

class A(object):

    def __init__(self):

        # 在初始化方法中定义了两个属性,一个共有属性,一个私有属性

        self.num1 = 100

        self.__num2 = 200

        # 定义私有方法

    #def __test(self):

        print '私有方法 %d %d' % (self.num1,self.__num2)

    def test(self):

        print '公有方法 %d' % self.__num2

        self.__test()

class B(A):

    def demo(self):

        # 在子类的方法中,不能访问父类的私有属性

        print '访问父类的私有属性 %d' % self.__num2

        # 在子类的方法中,不能调用父类的私有方法

        self.test()

# 创建了一个子类对象

b = B()

print b

# 在外界不能直接访问对象的私有属性/调用私有方法

# print b.__num2

# b.__test

b.test()

python中各种属性与方法深析

二.类属性和类方法

Python中一切皆对象

    class AAA(): 定义的类属性属于类对象

    obj1 =AAA(): 属于实例对象

    在运行程序时,类同样会被加载到内存

    在python中,类是一个特殊的对象--类对象

    除了封装实例(对象)的属性和方法外,类对象还可以有自己的属性和方法

    通过 类名. 的方式可以直接访问类的属性或者调用类的方法

类属性就是针对类对象定义的属性

    使用赋值语句在class关键字下方可以定义类属性

    类属性用于记录于这个类相关的特性

实例演练:

class Tool(object):

    # 1.使用了赋值语句定义类属性,记录所有的工具的数量

    count = 0

    def __init__(self,name):

        self.name = name

        Tool.count += 1

tool1 = Tool('斧头')

tool2 = Tool('榔头')

tool3 = Tool('*')

print Tool.count

python中各种属性与方法深析

类方法就是针对类对象定义的方法

    在类方法内部就可以直接访问类属性或者调用其他类方法

语法如下:

@classmethod

def 类方法(cls):

pass

类方法需要修饰器@classmethod来标识,告诉解释器这是一个类方法

实例演练:

class Toy(object):

    # 1.定义类属性

    count = 0

    # 2.定义类方法

    @classmethod

    def show_toy_count(cls):

    #在类方法的内部,访问当前的类属性

        print '玩具对象的数量 %d' % cls.count

    def __init__(self,name):

        self.name = name

        # 让类属性的值 +1

        Toy.count += 1

# 创建玩具对象

toy1 = Toy('玩具狗')

toy2 = Toy('玩具车')

toy3 = Toy('玩具熊')

# 调用类方法

Toy.show_toy_count()

python中各种属性与方法深析

三.静态方法

静态方法

在开发时,如果需要在类中封装一个方法,这个方法:

既不需要访问实例属性或者调用实例方法

也不需要访问类属性或者调用类方法

这个时候可以把这个方法封装成一个静态方法

语法如下:

@staticmethod

def 静态方法():

pass

静态方法需要修饰器@staticmethod来标识,告诉解释器这是一个静态方法

通过'类名.静态方法()'来调用静态方法

实例演练:

class Cat(object):

    @staticmethod

    # 静态方法不需要传递第一个参数:self

    def call():

        print '小猫喵喵叫~'

# 通过类名.调用静态方法(和类方法的调用相似)

# 不需要创建对象,直接可以使用(当然创建对象调用也没问题)

Cat.call()

python中各种属性与方法深析

四.通过了上面的方法和属性的学习,我们现在将它们混合在一起,写一个综合实例。

实例演练:

要求:

1.设计一个Game类

2.属性

类属性,记录游戏的历史最高分(与这个游戏类有关系,与每次游戏无关)

实例属性,记录当前游戏玩家的玩家姓名

3.方法:

        静态方法:方法show_help显示游戏帮助信息

类方法:方法show_top_score显示历史最高分

实例方法:方法start_game开始当前玩家的游戏

4.主程序步骤

1.查看帮助信息

2.查看历史最高分

3.创建游戏对象,开始游戏

具体实现代码:

class Game(object):

    # 1.记录历史最高分

    top_score = 0

    def __init__(self,player_name):

        self.player_name = player_name

    @staticmethod

    def show_help():

        print '@#@[email protected]!$'

    @classmethod

    def show_top_score(cls):

        print '历史记录 %d' % cls.top_score

    def star_game(self):

        print '%s 开始游戏了' % self.player_name

#1.查看游戏帮助信息

Game.show_help()

# 2.查看历史最高分

Game.show_top_score()

# 创建游戏对象。开启游戏

game = Game('小明')

game.star_game()

python中各种属性与方法深析

实例小结:

1.实例方法:方法内部能够访问实例属性,也访问其他(类属性,类方法,实例方法,静态方法等等),也就是说当不知道用什么方法时,用实例方法准没错。

2.类方法:方法内部只能够访问类属性

3.静态方法:方法内部不需要访问实例属性和类属性

提问:如果方法内部,既需要访问实例属性,又需要访问类属性,应该定义什么方法?

解答:应该定义实例方法,因为类只有一个,在实例方法的内部可以使用 类名.访问类属性

#######觉得这个特别有意思,实例方法里面访问另一个实例方法。

class Game(object):

    # 1.记录历史最高分

    top_score = 0

    def __init__(self,player_name):

        self.player_name = player_name

    @staticmethod

    def show_help():

        print '@#@[email protected]!$'

    @classmethod

    def show_top_score(cls):

        print '历史记录 %d' % cls.top_score

    def star_game(self):

        print '%s 开始游戏了' % self.player_name

        print Game.top_score

    def ab(self):

        Game.star_game(self)

        pass

#1.查看游戏帮助信息

Game.show_help()

# 2.查看历史最高分

Game.show_top_score()

# 创建游戏对象。开启游戏

game = Game('小明')

game.star_game()

game.ab()

python中各种属性与方法深析

其实再想想,和函数的访问是一样的。(并没有多么高大上)

def a():

    print 'a'

def b():

    a()

    print 'b'

b()

python中各种属性与方法深析