代码改变世界

Python 面向对象(二)

2018-06-11 08:43  钱先生  阅读(202)  评论(0编辑  收藏  举报
 

类 ==> 实例化 ==> 实例对象

__init__ 构造函数

self.name = name # 属性, 成员变量

def sayhi() # 方法, 动态属性

def get_heart(self):

  return self.__heart # 提供对外访问接口, 但是外部只能获取其值,不能改变其值.

 

属性

  • 公有属性
    • 当所有属于本类的对象都能访问的属性称为公有属性(即全局属性, 在类中定义的, 而不是在某一个方法<包括构造方法>中定义的 ? 不对吧, java中全局变量也可以私有化的, 只是看有没有private修饰而已).
  • 私有属性
    • __private_attr_name = value
    • 强制访问私有属性方法: 实例对象_类名__属性名

 

 

面向对象的特性

  • 封装
    • 对象和类概念的主要特性
    • 把客观事物封装成抽象的类, 并且类可以把自己的数据和方法只让可信的类或对象操作, 对不可信的进行信息屏蔽.
  • 继承
    • 可以使用现在类的所有功能, 并在无需重新编写原来类的情况下对这些功能进行扩展.
    • 通过继承创建的新类称为"子类"或"派生类".
    • 被继承的类称为"基类". "父类"或"超类".
    • 继承的过程, 就是从一般到特殊的过程.

 

#!/usr/bin/python
# -*- coding: utf-8 -*-


class Role(object):
    nationality = "JP"

    def __init__(self, name, role, weapon, life_value=100, money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value  # 公有属性
        self.money = money
        self.__heart = "Normal"  # 私有属性, 对外不可见(相当于java的private)

    def shot(self):
        print("%s is shooting" % self.name)
        self.__heart = "Dead"
        print(self.__heart)  # 私有属性可以内部访问

    def get_heart(self):
        return self.__heart  # 提供对外访问接口, 但是外部只能获取其值,不能改变其值.

    def got_shot(self):
        print("ah... i got shot...")

    def buy_gun(self, gun_name):
        print("just bought %s" % gun_name)
        self.weapon = gun_name  # 这样如果买了什么新武器, 也会同步更新属性weapon的值

    def __del__(self):   # 程序的收尾工作. 比如可以关掉一些文件,清除一些链接等.
        print("del...run...")


r1 = Role('Alex', 'police', 'AK47')  # 生成一个角色
r2 = Role('Jack', 'terrorist', 'B22')  # 生成一个角色

r1.shot()
r2.buy_gun('AK47')
print(r2.weapon)  # 在buy_gun()方法中添加self.weapon = gun_name, 这样若购买了新的武器, 就能更新属性weapon的值

# print(r1.get_heart())
print(r1._Role__heart)  # 外部强行访问一个私有属性

# 更改类的公有属性有两种方法
Role.nationality = "US"  # 方法1. 所有对象的nationality值都会被更改.
r1.natiocnality = "Thailand"  # 方法2.     只有对象r1的nationality值会被更改.


def shot2(self):  # 在类中, 直接调用方法, 会自动把实例对象传入方法. 在类外面的方法, 需要自己把实例传入方法.
    print("my own shot method")


r1.shot = shot2
r1.shot(r1) # 调用的其实是shot2()方法. 因方法shot2()不在类中, 所以需要自己把参数传入.


del r1  # 清除实例r1. 注意: 内存没有删, 只是删除了内存的引用关系(相当于标识该实例不用了, 稍后自动回收机制会真正清除该实例).