引子:类的对象在内存中的表示
def dog(name,dog_type):
def bark(d):
print(d,'wang wang wang ...')
data = {
'name':name,
'type':dog_type
'bark':bark
}
调用方法:
d1 = dog('小哈','哈士奇')
d1['bark'](d1)
可以阻止不同类型角色的方法混用
但是同类角色也有不同的地方,这时候快速开发等等需要引入面向对象的概念
对象间复杂的关系描述,有相同点也有不同点。需要面向对象的思想
1.类 略
2.对象 略
3.封装
作用防止内部对象数据不能被外部随意修改
使外部程序不需要关注对象内部的构造,只需要通过对象对外提供的接口进行访问
4.继承
5.多态
“一个接口,多种实现”
------------------------
class Dog(object): country = 'JP' #全局变量,通过类修改后,所有对象全改,通过对象修改只是单个对象改了 def __init__(self,name): self.NAME = name #成员属性 def sayhi(self): print('hello, I am a dog',self.NAME)
self表示对象本身,NAME为类的成员属性
d = Dog("a") # Dog(d,"a")
d2 = Dog("b")
类-->实例化--->实例对象
__init__ #构造函数
self.name = name #成员属性
def sayhi() #方法
* 私有属性外部不能直接访问,两个下划线定义,属于该对象内部私有。
self.__heart = "Normal"
如果想让私有属性只能被读 不能被改可以
def get__heart(self):
return self.__heart
强制访问私有属性:r1._Role__heart r1对象名,Role类名,__heart私有属性
* 公有属性:所有属于该类的对象都可以访问的属性,属于该类。(常量)country
实例化之前就已经存在,可以通过 类名.共有属性去访问
通过类名去改country,那么以后所有通过对象去访问的country都改了
通过某实例去改,实际是在r1内存中加了一个country
r1.country=CN 只有r1对象改了,其他没有变还是JP
* 成员属性,self.NAME等属性,属于对象本身。
注意:country,sayhi在内存中只有一份,对象调用的时候都是把对象的引用传给类中的方法调用。
可以看出方法也是公有的。例如sayhi只有一份。
如果要改成私有方法(每个对象单独的一份)需要:
def private(self):
print("private")
r1.sayhi = private
r1.sayhi(r1)