python之面向对象初识
一、面向对象初识
1、结构上 面向对象分成两部分:属性、方法
class A: name = 'xiaoming' # 静态属性、静态变量、静态字段。 def func1(self): # 函数、动态属性、方法。 pass
2、函数与面向对象:
1,函数封装一个功能,而面向对象封装多个相关的功能。
2,面向对象比较抽象,它是一种思想,站在上帝的角度去理解它。
3,面向对象程序可扩展,对象都是一个个独立的。耦合性,差异性。
函数: def register(argv): pass def login(argv): pass def shoppingcar(self): pass 面向对象: class Shopping: def __init__(self): # 特殊方法 pass def register(self): pass def login(self): pass def shoppingcar(self): pass
3、类与对象:
类:具有相同属性或者功能的一类实物。
对象:对象是类的具体体现。
二、类名、对象的使用
1、类可以理解为:一个公共框架,一个公共模型
class person: animal = '高级动物' walk_way = '直立行走' language = '语言' def eat(self): print('小心吃屎你') def play(self): print('天天就知道玩')
2、类名的使用
1,查看类中的所有属性及方法 __dict__
print(person.__dict__) # 查看类中的所有属性及方法
print(person.__dict__['animal']) # 通过__dict__方式可以查看单独的属性及方法,但是不能进行增删改
person.__dict__['animal'] = '低级动物' # 改:报错
person.__dict__['name'] = 'xiaoming' # 增:报错
del person.__dict__['animal'] # 删:报错
工作中,学习中一般用到 __dict__只是用来查看类中的所有属性及方法,不进行其他操作。
2,查看(增删改)类中某个属性用万能的点 .
print(person.animal) #查 print(person.language) person.name = 'xiaoming' # 增 print(person.name) person.language = '中文' #改 print(person.language) del person.walk_way #删 print(person.__dict__)
3,操作方法,用类名可以执行方法,但是一般不通过类名操作!!!
person.__dict__['eat'](111) # 不建议通过__dict__执行方法
person.play(666)
3、对象的使用
class person: animal = '高级动物' walk_way = '直立行走' language = '语言' def __init__(self,name,age,eye): # 功能:给对象封装属性的。 self.name1 = name self.age1 = age self.eye1 = eye def eat(self): print('小心吃屎你') def play(self): print('天天就知道玩') obj = person('xiaobai',1000,'小眼睛') # 这个过程是一个实例化过程,他会实例化一个对象(会在内存实例化一个对象空间)。 print(obj) #obj是对象空间的地址 print(obj.name1) # 通过对象查看属性
实例化过程内部进行了三个阶段:
1,首先遇到 类名() 就会在内存中开辟一个对象空间,只有一个类对象指针(用一个变量接收这个对象空间地址)
2,然后自动执行类中的__init__方法,并且将对象空间地址自动传给self参数,其他参数手动传入。
3,最后执行__init__方法 给对象空间封装相应的属性。
对象操作对象空间:
1,对象查看对象空间所有的属性也可用 __dict__
print(obj.__dict__) # 返回一个包含对象空间所有属性的字典
2,对象操作对象的某个属性(增删改查)用万能的点.
obj.sex = '男' # 增
print(obj.sex)
del obj.eye1 # 删
print(obj.__dict__)
obj.age1 = 18 # 改
print(obj.age1)
print(obj.name1) #查
print(obj.__dict__) #查
3,对象操作类空间的属性:只能查
print(obj.animal) #查
obj.animal = '低级动物' # 想要这样改类的属性,是改不了的,它会为对象生成一个animal的属性并不会改变类的 animal
print(obj.animal) # 低级动物
print(person.animal) # 高级动物
del obj.language # 删:报错
4,对象操作类空间的方法:对象.方法()
obj.eat()
三、类名称空间,对象名称空间
公用模板,公共框架 class GameRole: rule = '游戏规则' def __init__(self,area,nickname,hp,ad): self.area = area self.nickname = nickname self.hp = hp self.ad = ad def attack(self): print('攻击谁') gailun = GameRole('德玛西亚','草丛伦',1000,75) #实例化对象gailun yasuo = GameRole('艾欧尼亚','托儿所',500,89) #实例化对象yasuo
一张图片解释:
1,对象能调用类中的属性与方法,但是不能修改类的属性和方法
实例化一个对象的时候,会建立对象指向类的指针,gailun.属性名,先从自己空间去找,
没有此属性它会通过类对象指针从类去找,类中找不到,会从父类去找。
gailun.attack = 666 # 这里并不是调用类的attack方法,而是给对象增加一个属性 attack = 666 print(gailun.attack) # 666 gailun.rule = gailun.rule # 相当于gailun.rule = '游戏规则' 对象.属性名='游戏规则' print(gailun.rule) gailun.nikename = '盖伦' #修改对象的属性 print(gailun.nickname)
2,类能不能调用对象的属性? 不能,因为类没有指向对象的指针
print(GameRole.area) # 报错
3,对象与对象之间可不可互相调用?
同一个类实例化出来的对象之间是不能互相访问的。
不同类实例化的对象有可能互相访问。
4,给对象封装属性:__init__ 任意位置。