python面向对象(二)

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> python面向对象(二)

点击上方”python宝典”,关注获取python全套视频,

技术文章第一时间送达!

属性查找

类有两种属性:数据属性和函数属性

  1. 类的数据属性是所有对象共享的

  2. 类的函数属性是绑定给对象用的


class BeijingStudent:
    school='Beijing'
    def learn(self):
        print('is learning')
        
    def eat(self):
        print('is eating')
    
    def sleep(self):
        print('is sleeping')
s1=BeiJingStudent()
s2=BeiJingStudent()
s3=BeiJingStudent()
#类的数据属性是所有对象共享的,id都一样
print(id(BeijingStudent.school))

print(id(s1.school))
print(id(s2.school))
print(id(s3.school))

'''
4377347328
4377347328
'''
#类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
#ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准
print(BeijngStudent.learn)
print(s1.learn)
print(s2.learn)
print(s3.learn)
'''
function BeijngStudent.learn at 0x1021329d8
bound method BeijngStudent.learn of __main__.BeijngStudent object at 0x1021466d8
bound method BeijngStudent.learn of __main__.BeijngStudent object at 0x102146710
bound method BeijngStudent.learn of __main__.BeijngStudent object at 0x102146748
'''
python面向对象(二)

在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类…最后都找不到就抛出异常  

绑定到对象的方法的特殊之处


#改写
class BeijingStudent:
    school='Beijing'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def learn(self):
        print('%s is learning' %self.name) #新增self.name

    def eat(self):
        print('%s is eating' %self.name)

    def sleep(self):
        print('%s is sleeping' %self.name)
s1=BeijingStudent('李坦克','男',18)
s2=BeijingStudent('王大炮','女',38)
s3=BeijingStudent('牛榴弹','男',78)

类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数


BeijingStudent.learn(s1) #李坦克 is learning
BeijingStudent.learn(s2) #王大炮 is learning
BeijingStudent.learn(s3) #牛榴弹 is learning

类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法

强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)


s1.learn() #等同于BeijingStudent.learn(s1)
s2.learn() #等同于BeijingStudent.learn(s2)
s3.learn() #等同于BeijingStudent.learn(s3)

注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。

类即类型

  提示:python的class术语与c++有一定区别,与 Modula-3更像。

  python中一切皆为对象,且python3中类与类型是一个概念,类型就是类


#类型dict就是类dict
list
class 'list'

#实例化的到3个对象l1,l2,l3
l1=list()
l2=list()
l3=list()

#三个对象都有绑定方法append,是相同的功能,但内存地址不同
l1.append
built-in method append of list object at 0x10b482b48
l2.append
built-in method append of list object at 0x10b482b88
l3.append
built-in method append of list object at 0x10b482bc8

#操作绑定方法l1.append(3),就是在往l1添加3,绝对不会将3添加到l2或l3
l1.append(3)
l1
[3]
l2
[]
 l3
[]
#调用类list.append(l3,111)等同于l3.append(111)
list.append(l3,111) #l3.append(111)
l3
[111]

对象之间的交互


class Garen:        #定义英雄盖伦的类,不同的玩家可以用它实例出自己英雄;
    camp='Demacia'  #所有玩家的英雄(盖伦)的阵营都是Demacia;
    def __init__(self,nickname,aggressivity=58,life_value=455): #英雄的初始攻击力58...;
        self.nickname=nickname  #为自己的盖伦起个别名;
        self.aggressivity=aggressivity #英雄都有自己的攻击力;
        self.life_value=life_value #英雄都有自己的生命值;
    def attack(self,enemy):   #普通攻击技能,enemy是敌人;
        enemy.life_value-=self.aggressivity #根据自己的攻击力,攻击敌人就减掉敌人的生命值。

我们可以仿照garen类再创建一个Riven类


class Riven:
    camp='Noxus'  #所有玩家的英雄(锐雯)的阵营都是Noxus;
    def __init__(self,nickname,aggressivity=54,life_value=414): #英雄的初始攻击力54;
        self.nickname=nickname  #为自己的锐雯起个别名;
        self.aggressivity=aggressivity #英雄都有自己的攻击力;
        self.life_value=life_value #英雄都有自己的生命值;
    def attack(self,enemy):   #普通攻击技能,enemy是敌人;
        enemy.life_value-=self.aggressivity #根据自己的攻击力,攻击敌人就减掉敌人的生命值。

实例出俩英雄


g1=Garen('草丛伦')
r1=Riven('锐雯雯')

交互:锐雯雯攻击草丛伦,反之一样


g1.life_value
455
r1.attack(g1)
g1.life_value
401

补充:


garen_hero.Q()称为向garen_hero这个对象发送了一条消息,让他去执行Q这个功能,类似的有:
  garen_hero.W()
  garen_hero.E()
  garen_hero.R()
python面向对象(二)

识别图中二维码,欢迎关注python宝典

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> python面向对象(二)


  转载请注明: 好好学java python面向对象(二)

 上一篇
python面向对象(一) python面向对象(一)
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 什么是面向对象的程序设计及为什么要有它面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么……面向过程的设计就好比精心设计好一
2021-04-05
下一篇 
面向对象之继承 面向对象之继承
点击上方”python宝典”,关注获取python全套视频, 技术文章第一时间送达! 初识继承什么是继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称为基类或超类,新建的类称为派生类或子类。
2021-04-05