写点什么

Python OOP-5

用户头像
若尘
关注
发布于: 2021 年 05 月 11 日
Python  OOP-5

12. 所用软件

  • 画图软件:Faststone capture

13. 抽象类

  • 抽象方法:没有具体实现内容的方法称为抽象方法

  • 抽象方法的主要意义是规范了子类的行为和接口

  • 抽象的使用需要借助 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 MethodTypeclass 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'
复制代码


发布于: 2021 年 05 月 11 日阅读数: 8
用户头像

若尘

关注

还未添加个人签名 2021.01.11 加入

还未添加个人简介

评论

发布
暂无评论
Python  OOP-5