Python(面向对象)

面向对象
面向对象: java  c#  php
面向过程: c 
python: 面向对象和面向过程
概念
test.py


num=0


def 函数名1():
函数体


def 函数名2():
函数体


# 声明类
class Person:
类体:
属性


方法


# 调用
函数名1()
函数名2()


person=Person()
面向过程:


1.英雄联盟   
   
   登录账号
   选择游戏区域
   选择游戏模式
   进入游戏
   ...
2.面向对象:
世界万物皆对象
User --->类
Role --->类
武器--->类
大象放到冰箱:
面向过程:
1.打开冰箱
2.放大象
3.关门


面向对象:
大象--->类
冰箱--->类
--->电脑


面向对象编程


事物 ----> 转成电脑能够理解


真实  ----> 抽象


用户 
商品




电脑高手: 类
买电脑 --->高手 --->买啦

特征: 是这一类事物所具有的共同的特征
动作: 同上
# 模型
class Student:
# 类属性
name="张三"


# 方法  
def show(self):
print(self.name)


# 对象 
'''
创建对象的格式:
   对象名=类名()
''' 
zhanghe=Student()
print(zhanghe)
zhanghe.show()
zhanghe.age=18  # 给属性赋值 动态给对象添加属性一种方式  
print(zhanghe.age)  # 取值并打印


zhangtao=Student()
print(zhangtao)
zhangtao.show()
print(zhangtao.age)  # 直接打印  报错的原因: 没有添加就使用了
类属性: 存在于类模板中
对象属性: 存在在具体的对象的内存空间中
区别
1. 对象.属性名=值   ---> 给当前对象添加了一个新的属性 如果里面已经存在此属性了则覆盖原有的值
2. 直接定义在类体中添加的称作:类属性
   类属性是属于Person类  ---> 模板
   
   该类属性: 取值: 类名.属性
            赋值: 类名.属性=新值


属性
类属性  ---> 模板属性 
对象属性 --->对象的属性  --->对象属性使用较多
方法
__init__: 在创建每一个对象的时候都会默认调用的方法,因此现在就可以将一些初始化的动作写到此方法中
参数: self   self就是一个对象   小调用这个对象就是谁
__init__是由python解释器负责调用
类名的首字母大写
所有的方法都是必须通过: 对象.方法名([参数])
__str__  打印对象名的时候会默认调用的方法. 该方法是由返回值的,返回值是以字符串的形式返回
返回的值就是对象打印的内容
类: 特征 动作  --->封装
属性类型: 
方法参数的类型:
字符串 列表  元组  字典 数值 布尔 ....
对象
1.类模型
2.定义属性,方法
属性
类属性: 对象名.属性   类名.属性名
 实例属性(对象属性)   对象名.属性  --->self.name
方法
普通方法
特点
1. 可以类属性Person.sex,对象属性self.name
2. 也可以访问实例方法:self.test()  类方法: Person.class_method()
作用:
都是要依赖对象调用的方法或者属性 
普通方法:
def printA(self,name):
print("======>",name)


def printA(self):
print("BBBBBBBB")
   
   方式1:
   test=Test()
   test.printA("二哈")      报错  


   方式2:
   test=Test()
   test.printA()     不报错
覆盖的原则: 只要名字相同则就发生覆盖
静态方法
特点:
1.定义格式:
  @staticmethod
  def 方法名():
  方法体
2.调用方式:
Person.static_method()  ---> 通过类名访问
zhangsan=Person()   
zhangsan.static_method() --->通过对象名调用


3.不能访问对象属性,可以通过类名.属性名的方式获取类属性
类方法
特点
1.格式:
   @classmethod
   def 方法名(cls):
    方法体
2.类方法中不能访问实例属性(对象属性),对象方法
作用
只能访问类属性,而且类模型只要分配内存,类方法就存在. 就可以使用类方法做一些动作
特殊方法
__init__ : 完成对象的初始化信息,创建对象默认就调用此方法
1.子类中没有定义,则找父类的__init__
 2.如果子类定义__init__,调用的就是自己 的
显式调用父类的__init__   父类类名.__init__(参数列表)
__str__ : 打印print(对象名)  ---> 在打印时看到的信息更加明确
__del__: 析构方法
1. 当空间引用计数为0的时候就会调用__del__    del 对象名
 2. 自动调用__del__: 当py文件执行到最后的时候也会调用
注意:但是不建议大家自己定义__del__方法,就会破坏默认的垃圾回收机制
__call__:
特点:
1. 就是对象作为方法使用  
2.__call__(self,添加其他的参数)
__new__:默认继承的是object
使用该方法创建当前实例对象,一般不重写,就算重写
也是调用父类的__new__方法,注意:一定要返回创建的对象
如果没有返回,__init__方法将不会被Python解释器调用
cls是类对象
封装
私有方法
就是在定义方法的时候,在方法名的前面"__"
外界无法访问私有属性,只有类自身可以访问__test
兄弟方法之间是可以相互访问的
私有属性
私有化: 只能在类中使用,归类私有
只要想将属性私有化则在属性前面添加两个下划线
只不过外界不能通过对象名.__属性名  但是如果想访问的话:_类名__属性名
set_xxx   设置值
get_xxx  获取值   有返回值
私有化属性,定义公有的set_xxx方法和get_xxx方法,供外界访问
私有方法:就是在定义方法的时候,在方法名的前面"__"
特点:外界无法访问私有方法,只有类自身可以访问self.__test()
继承
1. 代码复用
Animal 就是父类   基类  就会把子类中共同的代码,提取到父类中
子类继承父类:
1.格式:
class 子类(父类):
类体


2.能够继承父类中非私有属性和方法


3. 子类除了继承父类的内容,还可以定义自己的内容


4. 继承多个父类
   class 子类(父类1,父类2,..):
    拥有了多个父类的属性和方法(非私有)
继承允许多层继承
继承:
子类的继承父类,有多个父类,继承也可以多层继承
非私有属性和方法


同名属性
 1. 对象属性:
  默认子类使用的就是自己的
同名的话仍然想使用父类的
  A.按照方法的调用方式是报错的
  B.super().属性名 也是报错的


 2. 类属性:
  A. 父类.属性名  -
  B. super 表示父类  super().属性名 
  C. super(子类名,子类对象).属性名 


同名方法
 1. 普通方法
 2. __init__


 子类的都会把父类的覆盖了,但是仍然可以使用父类,
  A. 父类.方法名(参数列表)  ---->必须要传递self
  B. super 表示父类  super().父类方法()  ---->参数中不用添加self  (推荐)
  C. super(子类名,子类对象).方法()  ---->参数中不用添加self
多继承顺序
print(C.__mro__)  # C3  查看父类的搜索顺序
print(inspect.getmro(C))


print(C.__bases__)  # 获取当前C类直接父类 


print(C.__base__)  # 只能从左边向右边获取第一个父类  只能拿到一个
新式类
class 类名:
类体
默认继承object
父类: object
父类 :Person
子类: Student
1. 继承中如果有重名: 父类中有name属性,子类中也存在name属性,如果调用的话优先找子类本身的属性name
   自身没有的话,继续会向上层父类中找
2. 同理方法也是如此
方法的重写: 
发生在子类中,子类方法的名字与父类的同名,默认找就是子类自己的
新式类和经典类
1.经典类:   type(实例对象)  


   <type 'instance'>


  新式类   type(实例对象)


  <class '__main__.类'>
 2.经典类:   __class__  


   __main__.B


  新式类   __class__


  <class '__main__.类'>  与type(实例名)相同的


 3.经典类采用深度优先,新式类采用广度优先


 4.新式类相同父类只执行一次构造函数,经典类重复执行多次
C是大写是类名
print(C.__mro__)   # 适用于新式类


经典类
print(inspect.getmro(C))
类里面:
__init__
__str__
__del__
__call__
__new__


结合类使用:
对象.__class__   ---> 返回的对象的模型
类名.__mro__     ----> 搜索父类的顺序
类名.__bases__   --->查看当前类的直接父类
类名.__base__    --->只能看到一个父类(从左向右)


dir(): 查看类中的属性
多态能够使代码更加灵活

猜你喜欢

转载自blog.csdn.net/qq_42240071/article/details/80409786