python面向对象补充

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python面向对象补充相关的知识,希望对你有一定的参考价值。

如何使用类

一、实例化:创建对象

例子一

x=int(10)
print(x)

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

>>> dict #类型dict就是类dict
<class ‘dict‘>

>>> d=dict(name=‘egon‘) #实例化
>>> d.pop(‘name‘) #向d发一条消息,执行d的方法pop。
‘egon‘

  

例子二:

class Garen:
    camp=‘Demacia‘
    def attack(self):
        print(‘attack‘)

obj=Garen()    #实例化,实例就是对象
print(obj)  #----> <__main__.Garen object at 0x0000000001E7CC18>

 

二、引用类的特征(类的变量)和技能(类的函数) 

基于面向对象设计一个款游戏:英雄联盟,每个玩家选一个英雄,每个英雄都有自己的特征和和技能,

特征即数据属性,技能即方法属性,特征与技能的结合体就一个对象。

从一组对象中提取相似的部分就是类所有对象都具有的特征和技能的结合体

在python中,用变量表示特征,用函数表示技能,因而类是变量与函数的结合体,对象是变量与方法(指向类的函数)的结合体

class Garen:
    camp=‘Demacia‘    #变量代表特征
    def attack(self):    #函数代表技能
        print(‘attack‘)

print(Garen.camp)
---->Demacia

print(Garen.attack)
---> <function Garen.attack at 0x0000000001E7F158>

Garen.attack(123)
---->attack

  

如何使用实例

class Garen:
    camp=‘Demacia‘    #变量,共有特征

    def __init__(self,nickname):
        self.nick=nickname       #变量,独有特征
    def attack(self,enemy):        #函数,技能
        # print(‘---->‘,self.nick)   #g1.nick
        print(‘%s attack %s‘ %(self.nick,enemy))


g1=Garen(‘草丛伦‘) #Garen.__init___(g1,‘草丛伦‘)
g2=Garen(‘猥琐轮‘)
print(g1.nick)
---->草丛伦

g1.attack(‘alex‘) 
---->草丛伦 attack alex

print(g1.camp)
---->Demacia

print(g1.attack)
---> <bound method Garen.attack of <__main__.Garen object at 0x00000000027BCD30>>

print(Garen.attack)
----><function Garen.attack at 0x00000000021DF048>

 

class Student:
    country=‘china‘

    def __init__(self,ID,NAME,SEX,PROVINCE):
        self.id=ID
        self.name=NAME
        self.sex=SEX
        self.province=PROVINCE

    def search_score(self):
        print(‘tell score‘)
    def study(self):
        print(‘study‘,self)

s1=Student(‘123‘,‘egon‘,‘male‘,‘shandong‘)
print(Student.__init__(s1,‘123‘,‘egon‘,‘male‘,‘shandong‘))  #调用__init__函数  
----> None

#调用对象的数据属性,对象的属性:对象本身就只有特征(变量)
s1.id=‘123‘              #调用对象的id属性
s1.name=‘egon‘           #调用对象的name属性
s1.sex=‘male‘            #调用对象的sex属性
s1.province=‘shandong‘  #调用对象的province属性

#查看函数
print(Student.country)      #查看类的数据属性
---->china

print(Student.__init__)     
----><function Student.__init__ at 0x0000000001E73B70>

print(Student.study)        
----><function Student.study at 0x0000000001E7F2F0>

print(Student.search_score) 
----><function Student.search_score at 0x000000000221F2F0>

Student.__init__(s1,‘123‘,‘egon‘,‘male‘,‘shandong‘)
Student.study(s1)   
---->study <__main__.Student object at 0x00000000021EC470>

 

总结:

类:一:实例化,二:引用名字(类名.变量名,类名.函数名)
实例:引用名字(实例名.类的变量,实例名.绑定方法,实例名.实例自己的变量名)

变量的增删改查及及运算相加
#变量的增删改查
class Garen:
    camp=‘Demacia‘

    def __init__(self,nickname):
        self.nick=nickname  #g1.nick=‘草丛伦‘
    def attack(self,enemy):
        print(‘%s attack %s‘ %(self.nick,enemy))

print(Garen.camp) #查
---->Demacia

Garen.camp=‘aaaaaa‘ #改
print(Garen.camp)
---->aaaaaa

del Garen.camp #删除
print(Garen.camp)
#报错:----> AttributeError: type object ‘Garen‘ has no attribute ‘camp‘

Garen.x=1 #增
print(Garen.x)
---->1

g1=Garen(‘alex‘)
print(g1.nick)
---->alex

g1.nick=‘asb‘ #改
print(g1.nick)
---->asb

del g1.nick   #删
print(g1.nick)
#报错:----> AttributeError: ‘Garen‘ object has no attribute ‘nick‘

g1.sex=‘female‘   #增
print(g1.sex)
---->female

Garen.x=1
Garen.y=2
Garen.res=Garen.x+Garen.y
print(Garen.res=Garen.x+Garen.y)
---->3

 python3中所有的类都是新式类

class A:pass
print(A.__bases__)   #__bases__查看继承
---->(<class ‘object‘>,),继承是object的都是新式类

python2中分为新式类和经典类

新式类和经典类声明的最大不同在于,所有新式类必须继承至少一个父类

所有类甭管是否显式声明父类,都有一个默认继承object父类

python2中新式类
class B(object):pass
class C(B):pass
print(B.__bases__)  #__bases__查看继承
---->(<class ‘object‘>,)

print(C.__bases__) 
---->(<class ‘__main__.B‘>,)

 

#python2中经典类
class D:pass
print(D.__bases__) 
---->()

 在 python3中上面的新式类和经典类都是新式类

 

 类的名称空间与对象的名称空间

class Student:
    country = ‘China‘

    def __init__(self, ID, NAME, SEX, PROVINCE):
        self.id = ID
        self.name = NAME
        self.sex = SEX
        self.province = PROVINCE

    def search_score(self):
        print(‘tell score‘)

    def study(self): #self=s1
        print(‘study‘,self)
    def walk(self):
        print(‘name:%s is walking‘ %self.name)

s1 = Student(‘123‘, ‘cobila‘, ‘female‘, ‘shanxi‘)
s2 = Student(‘124‘, ‘cobilamei‘, ‘femaleasfd‘, ‘shasdfanxi‘)

s1.walk()
---->name:cobila is walking

s2.walk()
---->name:cobilamei is walking
print(Student.__dict__) #__dict__,查看名称空间,查看类的名称空间 ---->{‘__module__‘: ‘__main__‘, ‘country‘: ‘China‘, ‘__init__‘: <function Student.__init__ at 0x00000000021D3A60>, ‘search_score‘: <function Student.search_score at 0x00000000021DF048>, ‘study‘: <function Student.study at 0x00000000021DF2F0>, ‘walk‘: <function Student.walk at 0x00000000021DF158>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Student‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Student‘ objects>, ‘__doc__‘: None} print(s1.__dict__) #__dict__,查看名称空间,查看对象的名称空间 {‘id‘: ‘123‘, ‘name‘: ‘cobila‘, ‘sex‘: ‘female‘, ‘province‘: ‘shanxi‘} print(s1.id) ---->123 s1.country="321" print(id(s1.country)) ---->42061192 print(s2.id) ---->124 s2.country="421" print(id(s2.country)) ---->42061248


#绑定方法,绑定方法的核心在于“绑定”,唯一绑定一个确定的对象
print(s1.study,id(s1.study))
----><bound method Student.study of <__main__.Student object at 0x000000000284CEB8>> 5139208

print(Student.study,id(Student.study))
----><function Student.study at 0x000000000284F2F0> 42267376

 

对象之间的交互

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 #根据自己的攻击力,攻击敌人就减掉敌人的生命值。

class Garen:
    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 #根据自己的攻击力,攻击敌人就减掉敌人的生命值。


# 对象之间的交互
r1=Riven(‘芮雯雯‘)
g1=Garen(‘草丛轮‘)
print(r1.life_value)
---->414

g1.attack(r1)
print(r1.life_value)
---->360

name=input(‘your nickname: ‘)
r1=Riven(name)

 

面向对象的编程思路

#应用场景
#找不到共同特征和技能不用强求

#对象:学校----->归类
    #共有的特征:商标为etiantian
    #共有的技能:招生
    #独有的特征:地址不一样,老师们,课程

class School:
    tag=‘etiantian‘
    def __init__(self,addr):
        self.addr=addr
        self.teacher_list=[]
        self.course_list=[]

    def zhaosheng(self):
        pass


#对象:老师---->归类
    #共同的技能:教课
    #独有的特征:名字,性别,level,课程

class Teacher:
    def __init__(self,name,sex,level):
        self.name=name
        self.sex=sex
        self.level=level
        self.course_list=[]
        
    def teach(self):
        pass


#对象:学生---->归类
    #共同的特征:
    #共同的技能:search_score,handin
    #独有的特征:学号,名字,性别,课程
class Student:
    def __init__(self,ID,name,sex):
        self.id=ID
        self.name=name
        self.sex=sex
        self.course_list=[]
    def search_score(self):
        pass

    def handin(self):
        pass

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 




以上是关于python面向对象补充的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路:面向对象补充

python8之面向对象补充之使用场景

Python 面向对象的补充

python面向对象补充

Python--面向对象的补充说明

python面向对象魔术方法补充