• python面向对象一


    1.1三种编程方法论

    1.面向过程:把复杂的任务一步一步分解成简单的任务。

    2.函数式编程:思想上接近于数学运算,根据某种方式,根据方式得出的结果。

    3.面向对象编程:一种编程方式,需要使用“类”和“对象”来实现,其实就是对“类”和“对象的”使用

    1.1.1  面向对象设计和面向对象编程

    1.面向对象设计(Object-oriented design):将一类的具体的事物的属性和方法整合到一起,即面向对象设计。

    注:面向对象(OO),是一种程序设计思想,不一定只有class定义类才是面向对象,def定义函数的就不是面向对象了,这是一种错误的判断,面向对象是一种思想。

     1 def person(name,age,gender):  #理解一个人种类    
     2     def play(name):     #人的方法
     3         print("[%s],正在玩python" %(name['name']))
     4     def eat(name):      #人的方法
     5         print("[%s]正在吃饭"%(name["name"]))
     6     def init(name,age,gender):  #初始化人的属性,以及方法。
     7         person1 = {
     8             "name":name,
     9             "age":age,
    10             "gender":gender,
    11             "play":play,
    12             "eat":eat
    13         }
    14         return person1
    15     return  init(name,age,gender)
    16 aa = person("xixi",18,"male")  #可以简单理解为生成了一个人的实例
    17 aa["play"](aa) #调用人的方法
    18 aa["eat"](aa)
    19 bb = person("xiaoxi",19,"female") #有创建了一个人的实例
    20 bb["play"](bb)
    21 
    22 #这就是一个简单的面向对象的设计
    View Code

    2.面向对象编程(Object-oriented programming):用定义类+实例/对象的方式去实现面向对象的设计。

    类(class):用来描述具有相同的属性和方法的集合,它定义了该集合中每个对象所共有的属性和方法。对象是类的实例

    对象(object):通过类定义(或创建)的数据结构实例。实例就是对象

    实例化:由类产生对象的过程叫实例化

    一.初始类

    定义类的格式

    1 class ClassName:    #注:定义关键字(类名)单词首字母要大写,这是一种规范
    2     #关于类的的注释文档
    3     类体
    4 
    5 #ClassName类名
    定义类的语法结构
    1 #创建一个类Data
    2 class Data:
    3     "这是一个测试的数据"
    4     pass
    5 
    6 #实例化类
    7 d1 = Data()   # Data()类实例化的过程  ,利用Data是实例化一个对象d1
    创建一个类

    python2中的类和python3中的类

     1 前提:
     2 1.在python2中分新式类和经典类,python3中统一都是新式类。
     3 2.新式类和经典类声明的最大不同在于,所有新式类必须继承至少一个父类。
     4 3.所有类不管是否显示声明父类,都有一个默认继承object父类(类的继承,下面会写)
     5 
     6 经典类:
     7 class 类名:
     8      pass
     9  
    10 新式类:
    11 class 类名(父类):
    12      pass
    13 
    14 注:在python3中上面这两种方式都是新式类
    2.x的类和3.x的类

    1.2属性

    类是用来描述某一个类的事物,类的对象是这一类事物中一个个体

    是事物就要有属性,(类)属性分为:

    1.数据属性:就是变量

    2.函数属性:就是函数,在面向对象中通常称为方法。

    注意:类和对象都用点(.)来访问自已的属性

    class.属性

    object.属性

    1.2.1类相关认识

    一.类的数据属性

    1 #定义了一个中国的类,在类中定义了一个属性person
    2 #类属性又称为静态变量,或者静态数据,这些属性是类对象绑定在一起的,不依赖实例。
    3 (不同的类,都有不同的属性,只有自已的类,才能访问自已的属性)
    4 
    5 
    6 class China:
    7     person = "Chinese"
    8 print(China.person)   #查看类的属性
    View Code

    二.类的方法

    1 class China:
    2     person = "Chinese"
    3     def create(self):  #这个self 是把类实例本身传进去
    4         print("%s 是个发展中国家" %self)
    5 
    6 country = "china"
    7 China.create(country)  #调用类的方法create
    类的方法

    三.查看类属性和方法

    有两种方式查看:

    1.dir(类名):查出的是类的属性名的列表

    2.类名.__dict__:查出的是一个字母,key为属性名,value为属性值

    1 print(dir(China))
    2 # ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'create', 'person']
    3 
    4 
    5 print(China.__dict__)
    6 # {'__dict__': <attribute '__dict__' of 'China' objects>, '__module__': '__main__', 'create': <function China.create at 0x000000F0DBB8E2F0>, '__doc__': None, '__weakref__': <attribute '__weakref__' of 'China' objects>, 'person': 'Chinese'}
    View Code

     查看特定属性的内容

    1 class China:
    2     person = "Chinese"
    3     def create(self):  #现在在这里只是一个参数的形式
    4         print("%s 是个发展中国家" %self)
    5 
    6 # 可以根据字典取key的方式,查看该属性的内容
    7 print(China.__dict__["person"])  #Chinese
    8 print(China.__dict__["create"])   #<function China.create at 0x000000569A2CE2F0>
    view

     

    1.2.2对象相关认识

     对象是有类实例化而来的,类实例的结果就是一个对象。

    由于类可以起到模块的作用,因此创建实例的时候,我们可以把共有的数据属性,可以给强制填写进去,通过定义一个特殊的__init__的方法,把共有的属性绑定到上去。

     1 class China:
     2     "我们是中国人"
     3     person = "Chinese"
     4     def create(self):  #现在在这里只是一个参数的形式
     5         print("%s 是个发展中国家" %self)
     6 # country = "china"
     7 # China.create(country)
     8 
     9 # 可以根据字典取key的方式,查看该属性的内容
    10 # print(China.__dict__["person"])  #Chinese
    11 # print(China.__dict__["create"])   #<function China.create at 0x000000569A2CE2F0>
    12 
    13 
    14 class Student:
    15     def __init__(self,name,age,gender):#这里的self 就相当于得到把对象本身自已
    16         self.name = name
    17         self.age = age
    18         self.gender = gender
    19     def score(self):
    20         print("%s 的成绩是99 "%self.name)
    21     def play(self):
    22         print("%s 的喜欢玩球,年龄是 %s" %(self.name,self.age))
    23 
    24 
    25 one = Student("xiaoxi",12,"male") #通过实例化的得到了一个对象one
    26 print(one.name)  #该对象的共有的数据属性  ,得到该对象的名字
    27 one.score() #该对象的方法score
    28 one.play()  #该对象的方法play
    29 two = Student("xixi",11,"male")#又创建了个对象
    30 print(two.name)
    View Code

    注意上面的代码:__init__方法的第一个参数永远是self,表示创建的实例本身,因此在__init__方法内部,就可以把各种属性绑定到self上,因为self就指向了创建的实例本身。

    有了__init__方法在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,python解释器会把自已实例变量传进去。

    和普通函数相比,在类中定义的函数只有一点不同,就是第一参数永远是实际变量,并且,调用时不用传递该参数。除此之外的类的方法和普通函数没什么区别。我们任然可以用函数的其他参数。

     

    实例属性:

    实例化的过程就是执行__init__的过程,这个函数内部只是为实例本身即self设定了一些变量,所有实例只有数据属性。

     1 class Teacher:
     2     def __init__(self,name,age,gender):
     3         self.name = name
     4         self.age = age
     5         self.gender = gender
     6     def teach(self):
     7         print("%s 老师正在教书,他现在已近 %s 岁了 ,是一位 %s 老师" %(self.name,self.age,self.gender))
     8 
     9 one_teacher = Teacher("小林",48,"male")
    10 print(one_teacher.__dict__) #查看实例属性
    11 print(one_teacher.name,one_teacher.age,one_teacher.gender) #访问实例的数据属性

    现在访问实例的函数属性(方法,其实就是类的函数属性)

     1 class Teacher:
     2     def __init__(self,name,age,gender):
     3         self.name = name
     4         self.age = age
     5         self.gender = gender
     6     def teach(self):
     7         print("%s 老师正在教书,他现在已近 %s 岁了 ,是一位 %s 老师" %(self.name,self.age,self.gender))
     8 
     9 one_teacher = Teacher("小林",48,"male")
    10 print(one_teacher.__dict__) #查看实例属性
    11 print(one_teacher.name,one_teacher.age,one_teacher.gender) #访问实例的数据属性
    12 #新加的下面3行内容
    13 print(Teacher.__dict__) #函数属性只存在于类中
    14 Teacher.teach(one_teacher) #我们只能通过类去调用类的函数属性,然后把实例当做变量传递给self
    15 one_teacher.teach() #注其实就是Teacher.teach(one_teacher)

    查看实例的属性同样是用dir和内置__dict__两种方式。

    警告:类和对象虽然调用__dict__返回时一个字典结构,但是千万不要直接修改该字典,会导致你原来oop不稳定。

    1.3类属性与对象(实例)属性

    类属性的增删改查

     1 class Teacher:
     2     country = "China"
     3     def __init__(self,name,age,gender):
     4         self.name = name
     5         self.age = age
     6         self.gender = gender
     7     def teach(self):
     8         print("%s 老师正在教书,他现在已近 %s 岁了 ,是一位 %s 老师" %(self.name,self.age,self.gender))
     9 
    10 #查看类的属性
    11 print(Teacher.country)
    12 #修改类的属性
    13 Teacher.country = "中国"
    14 print("修改后类的属性》》",Teacher.country)
    15 #删除类属性
    16 del Teacher.country
    17 print(Teacher.__dict__)
    18 # print(Teacher.country)  #在打印会报错,提示没有country 属性
    19 Teacher.location = "Beijing"
    20 print("添加类属性>>",Teacher.location)
    21 print(Teacher.__dict__)
    22 
    23 
    24 
    25 #给类在添加一个函数属性(方法),
    26 def do(self,homework):
    27     print("%s 正在修改 %s" %(self.name,homework))
    28 
    29 Teacher.do = do  #把do函数,添加到类里面去
    30 print(Teacher.__dict__)
    31 one = Teacher("xiaoli",30,"female")
    32 Teacher.do(one,"homework") #把one实例传进去

    实例属性的增删改查

     1 class Teacher:
     2     country = "China"
     3     def __init__(self,name,age,gender):
     4         self.name = name
     5         self.age = age
     6         self.gender = gender
     7     def teach(self):
     8         print("%s 老师正在教书,他现在已近 %s 岁了 ,是一位 %s 老师" %(self.name,self.age,self.gender))
     9 
    10 
    11 
    12 two = Teacher("dav",32,"male")
    13 #查看实例属性
    14 print(two.name)
    15 print(two.__dict__)
    16 print(two.country) #这里country不存在two的属性字典中,
    17 
    18 #删除实例属性
    19 # del two.country  #报错
    20 del two.name
    21 print(two.__dict__)
    22 # 增加实例属性
    23 two.name = "xixi" #又重新添加一个name属性
    24 two.test = "data test"
    25 print(two.__dict__)
    26 #修改实例属性
    27 two.age = 35
    28 print(two.__dict__)

    注:上面虽然这样写,但是一般最好不要修改原来oop。

    总结:

    1.类是创建实例的模块,而实例则是一个一个具体的对象,各个实例拥有的数据都相互独立,互不影响。

    2.方法就是实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据。

    3.通过实例上调用方法,我们就直接操作了对象内部的数据,但无需知道方法内部实现的的细节。

  • 相关阅读:
    ExtJs2.0学习系列(2)Ext.Panel
    ExtJs2.0学习系列(1)Ext.MessageBox
    ExtJs2.0学习系列(3)Ext.Window
    微软挖IBM公司Lotus合伙人 炫耀协同软件优势
    Vector
    H264和MPEG4起始码(startcode)
    Android有趣的全透明效果Activity及Dialog的全透明(附android系统自带图标大全)
    C++中的vector使用范例
    关于Vector
    用vector取代Cstyle的数组
  • 原文地址:https://www.cnblogs.com/keme/p/6201194.html
Copyright © 2020-2023  润新知