首页 > 其他 > 详细

初识面向对象

时间:2020-05-26 13:32:33      阅读:33      评论:0      收藏:0      [点我收藏+]

参考链接

一、面向过程:面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。

优点:极大地降低了写成学的复杂度,只需要顺着执行的步骤,堆叠代码即可

缺点:一套流水线或者流程就是用来解决一个问题,如果修改代码就都得改变

二、面向对象:上帝的思想

优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。

三、类:是具有相同特征的一类事物(人,狗,老虎)

  对象/实例:具体的某一事物

  实例化:类到对象的过程(实例=类名(参数1,参数2))

四、初始类和对象

类的定义:class  Person:   #class  类名:注意类名后面不要括号 

        类体

在python中,用变量表示特征,用函数表示技能,因而具有相同的特征和技能的一类事物就是‘类’,

对象则是这一类事物中具体的一个

类的两种作用:属性引用和实例化

1、属性引用

1 class Person:
2     role = 中国人  #类属性----静态属性
3     def walk(self):  #这里的函数叫做方法-----动态属性
4         #注意:self必须写
5         print(person is walking ...)
6 print(Person.role) #查看类属性
7 print(Person.walk) #查看类方法 , 用类名去调用方法名,打印出来的是内存地址

2、实例化

 1 class Person:
 2     role = 中国人
 3     def __init__(self,name,sex):
 4         self.name=name
 5         self.sex=sex
 6     def walk(self):
 7         print(person is walking)
 8 
 9 hy = Person(haiyan,21) #实例化:类名(参数1,参数2)  类名()就等于在执行Person.__init__()
10 print(hy.name)  #直接查看属性   对象名.属性名
11 print(hy) #返回的是一个对象
12 hy.walk()  #调用方法  ,对象名.方法()

对象的两种作用:查看属性和调用方法(上面的实例化中讲到)

五、关于self

self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给它起个别的名字,但是一般正常人都不会这么做,因为你改了别人就不认识了。

注意:def  __init__(self):   这句话可以写也可以不写,只要有参数参进来的时候就必须得写

   def  方法名(self):这里的self必须得写

六、特殊的类属性

 

 print(Person.__name__,type(Person.__name__)) #查看类的名字(这里的类名是字符串类型的)
 print(Person.__dict__) #查出的是一个字典,key为属性名,value为属性值
 print(Person.__doc__)# 就是把注释显示出来
 print(dir(Person)) #查看类的方法,以列表的形式显示出来
 print(Person.__module__) #类定义所在的模块
 print(Person.__class__)
 print(isinstance(hy,Person))#判断对象 是否是类的实例

 

七、对象的相关知识

  1.对象是关于类而实际存在的一个例子,即实例

  2.对象/实例只有一种作用:属性引用  

egg = Person(egon,10,1000)
print(egg.name)
print(egg.aggressivity)
print(egg.life_value)<br>当然,你也可以引用一个方法,因为方法也是一个属性。 

八、面向对象小结

定义及调用的固定格式

 1 class 类名:
 2       def __init__(self,参数1,参数2):
 3           self.对象的属性1 = 参数1
 4           self.对象的属性2 = 参数2
 5   
 6       def 方法名(self):pass
 7   
 8       def 方法名2(self):pass
 9   
10 对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
11                    #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
12                    #括号里传参数,参数不需要传self,其他与init中的形参一一对应
13                    #结果返回一个对象
14 对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
15 对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可

九、对象之间的交互

 

技术分享图片
 class Person:
     def __init__(self,name,aggr,life_value):
         self.name=name
         self.aggr=aggr
          self.life_value=life_value
      def attack(self,dog): #人可以攻击狗
          dog.life_value=dog.life_value-self.aggr
  class Dog:
      def __init__(self,name,aggr,life_value):
         self.name = name
         self.aggr = aggr
         self.life_value = life_value
 
     def attack(self,egg): #狗也可以攻击人
         egg.life_value = egg.life_value - self.aggr
 egg = Person(egon,250,1000)
 dog = Dog(乐乐,50,2000)
 print(狗没攻击前egon的生命值:,dog.life_value)  #没攻击前egon的生命值
 egg.attack(dog)   #让egon去攻击狗乐乐
 print(狗攻击后egon的生命值:,dog.life_value)  #攻击后egon的生命值
 
 
 print(egon没攻击前狗的生命值:,egg.life_value)  #没攻击前egon的生命值
 dog.attack(egg)   #让狗去攻击egon
 print(egon攻击后狗的生命值:,egg.life_value)  #攻击后egon的生命值
人狗大战小程序

十、类命名空间与对象,实例的命名空间

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字成为类的属性

而类有两种属性:静态属性和动态属性

  • 静态属性就是直接在类中定义的变量
  • 动态属性就是定义在类中的方法

示例:

class Person:                 # 类名
    country = China         # 创造了一个只要是这个类就一定有的属性  静态属性                           

    def __init__(self,name,blood,aggr,sex):  # 初始化方法,self是对象,是一个必须传的参数
                              # self可以理解为一个可以存储很多属性的大字典,只是往字典里添加属性的方式发生了一些变化(用.的方式)
        self.name = name   #等号左边的name是我们自定义的名字,相当于字典中的key,也可以用其它名字
                #等号右边是传进来的参数值,相当于字典中的value
self.hp = blood self.aggr = aggr self.sex = sex def walk(self,n): # 类中的方法一般情况下必须传self参数,且必须写在第一个 # 后面还可以传其他参数,是自由的 print(%s走走走,走了%s步%(self.name,n)) # print(Person.country) # 类名可以查看类中的属性,不需要实例化就可以查看 China alex = Person(狗剩儿,100,1,) # 类名还可以实例化对象,alex对象 #实例化,此时alex就相当于Person中的self print(alex.__dict__) # 查看所有属性 {‘name‘: ‘狗剩儿‘, ‘hp‘: 100, ‘aggr‘: 1, ‘sex‘: ‘男‘} print(alex.name) # 查看属性值 #狗剩儿 Person.walk(alex,5) #可简写成下面的方式,而且以后我们都用下面的简写方式调用类中的方法 alex.walk(5) # 调用方法 类名.方法名(对象名) #对于类的字典,只能看不能改 print(Person.__dict__) #{‘__module__‘: ‘__main__‘, ‘country‘: ‘China‘, ‘__init__‘: <function Person.__init__ at 0x000001CB59AD6048>, # ‘walk‘: <function Person.walk at 0x000001CB59AD6620>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Person‘ objects>, # ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Person‘ objects>, ‘__doc__‘: None} print(Person.__dict__[country]) #查看类的属性 #Chine # Person.__dict__[‘country‘] = ‘印度‘ #这种写法是错误的,不能修改类中属性值 # 可以通过操作字典的方式查看或者修改对象的属性 print(alex.__dict__) #{‘name‘: ‘狗剩儿‘, ‘hp‘: 100, ‘aggr‘: 1, ‘sex‘: ‘男‘} print(alex.name) #狗剩儿 # print(alex.__dict__[‘name‘]) #也通过字典的方式查看对象属性 #狗剩儿 alex.name = ‘二哥‘ #修改对象属性 # alex.__dict__[‘name‘] = ‘二哥‘ #也可以通过字典的方式修改对象属性 print(alex.__dict__) #{‘name‘: ‘二哥‘, ‘hp‘: 100, ‘aggr‘: 1, ‘sex‘: ‘男‘} print(alex.name) #二哥 alex.age = 18 #为对象添加新属性 print(alex.__dict__) #{‘name‘: ‘二哥‘, ‘hp‘: 100, ‘aggr‘: 1, ‘sex‘: ‘男‘, ‘age‘: 18} #总结 # 对象 = 类名() # 过程: # 类名() 首先 会创造出一个对象,创建了一个self变量 # 调用init方法,类名括号里的参数会被这里接收 # 执行init方法 # 返回self,实例化对象就相当于这个返回的self # 对象能做的事: # 查看属性 # 调用方法 # __dict__ 对于对象的增删改查操作都可以通过字典的语法进行 # 类名能做的事: # 实例化 # 调用方法 : 只不过要自己传递self参数 # 调用类中的属性,也就是调用静态属性 # __dict__ 对于类中的名字只能看 不能操作

 

初识面向对象

原文:https://www.cnblogs.com/zh-xiaoyuan/p/12964681.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!