Python OOP-5

简介: Python OOP-5

12. 所用软件

  • 画图软件:Faststone capture

13. 抽象类

  • 抽象方法:没有具体实现内容的方法称为抽象方法
  • 抽象方法的主要意义是规范了子类的行为和接口
  • 抽象的使用需要借助abc模块

    import abc
    
  • 抽象类:包含抽象方法的类叫做抽象类,通常成为ABC类
  • 抽象类的使用

    • 抽象类可以包含抽象方法,也可以包含具体方法
    • 抽象类中可以有方法也可以有属性
    • 抽象类不允许直接实例化
    • 必须继承才可以使用,且继承的子类必须实现所有继承来的抽象方法
    • 假定子类没有实现所有继承的抽象方法,子类也不能实例化
    • 抽象类的主要作用是设定类的标准,以便于开发的时候具有统一的规范

14. 自定义类

  • 类其实是一个类定义和各种方法的自由组合
  • 可以定义类和函数,然后自己通过类来直接赋值
  • 可以借助于MethodType实现
  • 借助于type实现
  • 利用元类实现- MetaClass

    • 元类是类
    • 被用来创造别的类
# 变量的三种用法

class A():
    def __init__(self):
        self.name = "haha"
        self.age = 18
        
a = A()
# 属性的三种用法
# 1. 赋值
# 2. 读取
# 3. 删除
a.name = "ruochen"
print(a.name)
del a.name
# print(a.name)
ruochen


# 类属性 property
# 应用场景:
# 对变量除了普通的三种操作,还想增加一些附加的操作,那么可以通过property完成
class A():
    def __init__(self):
        self.name = "haha"
        self.age = 18
    # 此功能,是对类变量读取操作的时候应该执行的函数功能
    def fget(self):
        print("我被读取了")
        return self.name
    # 模拟的是对变量进行写操作的时候执行的功能
    def fset(self, name):
        print("我被写入了,但是还可以做好多事情")
        self.name = name + "1"
     # fdel模拟的是删除变量的时候进行的操作   
    def fdel(self):
        pass
    
    # property的四个参数顺序的固定的
    # 第一个参数代表读取的时候需要调用的函数
    # 第二个参数代表写入的时候需要调用的函数
    # 第三个是删除
    name2 = property(fget, fset, fdel, "这是一个property的例子")
    
a = A()
print(a.name)

print(a.name2)
haha
我被读取了
haha


# 抽象

class Animel():
    
    def sayHello(self):
        pass
    
class Dog(Animel):
    
    def sayHello(self):
        print("问一下对方")

class Person(Animel):
    
    def sayHello(self):
        print("Kiss me")
        
d = Dog()
d.sayHello()

p = Person()
p.sayHello()
问一下对方
Kiss me


# 抽象类的实现

import abc

# 声明一个类并且指定当前类的元类
class Hunam(metaclass=abc.ABCMeta):
    
    # 定义一个抽象的方法
    @abc.abstractmethod
    def smoking(self):
        pass
    
    # 定义类抽象方法
    @abc.abstractclassmethod
    def drink():
        pass
    
    # 定义静态抽象方法
    @abc.abstractstaticmethod
    def play():
        pass
    
    def sleep(self):
        print("Sleeping......")
# 函数名可以当变量使用

def sayHello(name):
    print("{}你好".format(name))

sayHello("A")

liumang = sayHello

liumang("A")
A你好
A你好


# 自己组装一个类

class A():
    pass

def say(self):
    print("Saying... ...")
    
class B():
    def say(self):
        print("Saying... ...")
        
say(9)

A.say = say

a = A()
a.say()

b = B()
b.say()
Saying... ...
Saying... ...
Saying... ...


# 组装类例子 2
# 自己组装一个类
from types import MethodType
class A():
    pass

def say(self):
    print("Saying... ...")
    
a = A()
a.say = MethodType(say, A)
a.say()
Saying... ...


help(MethodType)
Help on class method in module builtins:

class method(object)
 |  method(function, instance)
 |  
 |  Create a bound instance method object.
 |  
 |  Methods defined here:
 |  
 |  __call__(self, /, *args, **kwargs)
 |      Call self as a function.
 |  
 |  __delattr__(self, name, /)
 |      Implement delattr(self, name).
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __get__(self, instance, owner, /)
 |      Return an attribute of instance, which is of type owner.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __hash__(self, /)
 |      Return hash(self).
 |  
 |  __le__(self, value, /)
 |      Return self<=value.
 |  
 |  __lt__(self, value, /)
 |      Return self<value.
 |  
 |  __ne__(self, value, /)
 |      Return self!=value.
 |  
 |  __reduce__(...)
 |      Helper for pickle.
 |  
 |  __repr__(self, /)
 |      Return repr(self).
 |  
 |  __setattr__(self, name, value, /)
 |      Implement setattr(self, name, value).
 |  
 |  ----------------------------------------------------------------------
 |  Static methods defined here:
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |  
 |  __func__
 |      the function (or other callable) implementing a method
 |  
 |  __self__
 |      the instance to which a method is bound



type(8)
int



# 利用type造一个类

# 先定义类应该具有的成员函数
def say(self):
    print("Saying... ...")
    
def talk(self):
    print("Talking... ...")
    
# 利用type来创建一个类
A = type("AName", (object, ), {"class_say":say, "class_talk":talk})

# 然后可以像正常一样使用类
a = A()
dir(a)
a.class_say()
Saying... ...


# 元类演示

# 元类写法是固定的,他必须继承于type
# 元类一般命名以MetaClass结尾
class CMetaClass(type):
    # 注意以下写法
    def __new__(cls, name, bases, attrs):
        # 自己的业务处理
        print("我是元类")
        attrs['id'] = '000000'
        attrs['addr'] = "1"
        return type.__new__(cls, name, bases, attrs)
    
# 元类定义完就可以使用,使用注意写法
class Teacher(object, metaclass=CMetaClass):
    pass

t = Teacher()

t.__dict__
t.id
我是元类





'000000'

目录
相关文章
表格存储表删除后重建,为什么会占用空间
表格存储表删除后重建,为什么会占用空间
156 3
|
消息中间件 分布式计算 Hadoop
利用Hadoop进行实时数据分析的挑战与解决方案
【8月更文第28天】随着大数据技术的快速发展,企业和组织面临着越来越复杂的实时数据处理需求。Hadoop 作为一种分布式存储和处理大数据的框架,虽然擅长于批处理任务,但在处理实时数据流时存在一定的局限性。为了克服这些限制,Hadoop 经常与其他实时处理框架(如 Apache Kafka 和 Apache Storm)结合使用。本文将探讨如何利用 Hadoop 结合 Kafka 和 Storm 实现近实时的数据处理,并提供相关的代码示例。
913 0
如何去掉字符串中文括号及其内部的内容三种方式
如何去掉字符串中文括号及其内部的内容三种方式
625 0
|
存储 算法 决策智能
Python 数学应用(三)(3)
Python 数学应用(三)
330 2
Python 数学应用(三)(3)
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
144 1
|
缓存 JSON 安全
URLSession 使用详解
当涉及到在 Swift 项目中进行网络请求时,URLSession 是一个强大且灵活的工具。它允许我们与服务器进行数据交换,从而获取或发送数据。本篇博客将介绍 URLSession 的基本使用方法,以及一些需要注意的事项,帮助你更好地利用 URLSession 进行网络请求。
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL企业版产品系列:满足不同场景需求的解决方案
PolarDB MySQL企业版产品系列:满足不同场景需求的解决方案 在数字化时代,企业对于数据处理的需求越来越多样化,对于数据库的选择也更为谨慎。PolarDB MySQL版为了满足不同场景的需求,提供了单节点、集群版、高压缩引擎(X-Engine)和多主集群(库表)4种不同的产品系列。下面我们将对这4种产品系列进行简要介绍,以帮助您更好地了解它们的特点和适用场景。
257 1
|
SQL 存储 分布式计算
基于MaxCompute+DataWorks离线同步某电商用户购买记录实践
本次实验使用DataWorks的DDL模式新建数据表,然后将保存在本地的某用户购买记录同步到MaxCompute数仓中,本实验采用的是增量数据同步,每次同步过来的数据会直接存储在MaxCompute中,不会覆盖之前的数据。
|
数据库
.商品秒杀-超卖
.商品秒杀-超卖问题
210 0
|
设计模式 前端开发 Java
职责驱动设计以及状态模式的变化
职责驱动设计以及状态模式的变化
职责驱动设计以及状态模式的变化