面向对象(三)

发布时间:2022-06-20 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了面向对象(三)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

面向对象(三)

昨日回顾

动静态方法

1.动态方法
语法结构

对象方法
class A:
  def func(self):
    pass
对象来调用会自动将对象当做第一个参数传入(self)

<br />

类方法
class A:
  @classmethod
  def func(cls):
    pass
对象和类调用的时候都是将类当做第一个参数传入(cls)

<br />

2.静态方法
语法结构
class A:
  @staticmethod
  def func():
    pass
相比于动态方法更像一个普通的方法
不需要特定参数,无论谁来调都需要传入固定的参数

继承

概念:获得本不属于自己的功能或者数据。

基本使用:

class 类名(父类名):

子类,派生类:继承者

父类,基类:被继承者

查找顺序

单继承

对象 ——》 类 ——》父类 ——》 父类的父类

多继承

菱形继承,一直走到父类 深度优势

菱形继承,走完所有子类,最后到父类 广度优先

派生类

重新定义父类的功能

如果需要使用父类方法,suPEr().父类的方法。

找到自己的目标,当目标完成时可以悠闲的回顾自己的往日,这便是最美好的事情了

面向对象(三)

今日学习内容

继承下的派生的实际应用

class B:  # 定义一个父类
    def a(self, number):  # 写入a函数
        number += 1  # 父类会对形参number+1
        PRint('加了1')
class A(B):  # 定义一个子类
    def a(self, number):  # 重写a函数
        if number == 0:  # 如果形参number等于0
            number += 100  # 加100
            print('加了100')
        else:
            super().a(number)  # 否则正常运行父类函数a
q = A()
q.a(0)
加了100
a = 100

q = A()
q.a(1)
加了1
a = 2

封装

封装也是面向对象三大特性之一

概念:将类中某些名字'隐藏'起来,只允许内部使用

内部使用需要一个通道‘接口’

隐藏方法:

class A(object):
  __number = 100
  1. 必须在类的定义阶段
  2. 在需要隐藏的数据前面使用两个下划线
  3. 在Python中并没有绝对隐藏,仅仅是做了变形
  4. __ 变量名 >>> 类名_ 变量名
  5. 即便知道变形后语法,也不可直接使用这种方法访问或调用
  6. 只能使用特定的通道(接口)去访问调用
class A(object):
  def __inIT__(self,number):
      self.__number = number  # 隐藏数据
  
  def check_info(self): 
    print('数字%d'%(self.__number))  # 调用接口

a = A(1)
a.check_info()

这样做的目的是为了阻隔外部调用这个类中内部的数据,类中会提供调用相对于通道(接口)。

property

将方法伪装成数据

有时候很多数据需要经过计算方法才可以获得,但是这些数据像是直接产生出来,更像数据

BMI指数
class Person(object):
    def __init__(self, name, height, weight):
        self.__name = name
        self.height = height
        self.weight = weight
    @property
    def BMI(self):
        # print('%s的BMI指数是:%s' % (self.name, self.weight / (self.height ** 2)))
        return '%s的BMI指数是:%s' % (self.__name, self.weight / (self.height ** 2))
      
# p2 = Person('eason',1.90,85)
# # p2.BMI()  # 23.5

多态

多态是面向对象三大特性中最后一个,我们只要理解什么是多态,什么是面向对象中的多态。

多态:一种事物的多种形态

在面向对象中,多态性

	class Animal(object):
    def speak(self):
        pass

  class Cat(Animal):
      def speak(self):
          print('喵喵喵')

  class Dog(Animal):
      def speak(self):
          print('汪汪汪')

  class Pig(Animal):
      def speak(self):
          print('哼哼哼')
          
c1 = Cat()
d1 = Dog()
p1 = Pig()
c1.speak()
d1.speak()
p1.speak()
          
对同一个类执行相同的方法,由于其类中的对象不同,获得的形态也不同,这就是多态

鸭子类型理论

鸭子类型理论是python中独有的

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

不同的子类继承了相同父类,所产生相同的功能

class F1:
    pass

# 假设,S1是我们的正统类,它继承于根正苗红的F1,是我们的正统类
class S1(F1):
    def show(self):
        print('S1.show')

# S2是路人甲,是个歪瓜裂枣,但是他自己也有一个叫show的方法。
class S2:
    def show(self):
        print('S2.show')
        
def Func(obj):
    """Func函数需要接收一个F1类型或者F1子类的类型"""
    obj.show()

s1_obj = S1()
Func(s1_obj)  # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj)  # 在Func函数中传入S1类的对象 s1_obj,执行 S2 的show方法,结果:S2.show

一切皆文件

“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、字符设备、块设备、 套接字等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。

面向对象(三)

面向对象之反射

通过字符串来操作对象的数据和功能

Python类的属性进阶 提供用字符串来操作类的属性/方法的方式。主要工具函数

hasattr(obj_bame,’属性名’)判断对象是否含有字符串对应的数据或者功能

setattr(obj_name,’属性名’,值)根据字符串给对象设置键值对(名称空间中的名字)

getattr(obj_bame,’属性名’)根据字符串获取对应的变量名或者函数名

delattr(obj_bame,’属性名’)根据字符串删除对象对应的键值对(名称空间中的名字)

实际使用案例

getattr

利用反射获取配置文件中配置信息
import 配置文件名
dir(settings)  # 获取对象中所有可以使用的名字
getattr(settings, '配置文件中的名字')


class FtpServer:  # 定义一个类
    def serve_forever(self):  # 定义一个函数
        while True:  # 循环
            inp = input('input your cmd>>: ').strip()  # 获取用户输入
            cmd, file = inp.split()  # 分割空格并赋值给cmd和file
            if hasattr(self, cmd):  # 如果该self对象中拥有用户输入的功能
                func = getattr(self, cmd)  # 调用实际功能
                func(file)  # 传入参数运行该功能

    def get(self, file):  # get功能
        print('Downloading %s...' % file)

    def put(self, file):  # put
        print('Uploading %s...' % file)
    
f = FtpServer()
f.serve_forever()

脚本宝典总结

以上是脚本宝典为你收集整理的面向对象(三)全部内容,希望文章能够帮你解决面向对象(三)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。