类 ==> 实例化 ==> 实例对象
__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. 注意: 内存没有删, 只是删除了内存的引用关系(相当于标识该实例不用了, 稍后自动回收机制会真正清除该实例).