魔法函数

__init__函数

init函数会在实例化A这个类的时候被调用

class A():
def __init__(self):
print('__init__函数') a = A()

显示结果:

__init__函数

__call__函数


class A():
def __call__(self):
print('__call__函数') a = A()
a()

显示结果:

但类被当成一个函数的时候会被调用

如果不写A类的call函数的话,会怎么在运行程序会怎么样呢?

Traceback (most recent call last):
File "D:/网站开发/oop/内置函数.py", line 6, in <module>
a()
TypeError: 'A' object is not callable

A类就会报一个typeerror的错误,大致的一个就是这个类不能当成一个函数来调用

__str__函数

class A():
def __str__(self):
return '被当成了字符串' a = A()
print(a)

str函数是将实例化的对象可以当做一个字符串来返回。

如果不写,再来看看会显示什么?

class A():
pass a = A()
print(a)

 <__main__.A object at 0x0000017E14B05D30>

就会把a的实例化地址显示出来

以上这三个函数都有一个相同的特征——无需调用,但需要在特定的时间才能触发。

其他内置函数

__dict__函数:

以字典的方式显示类的成员组成

__doc__函数:

获取文档信息——就是写在类最前面的注释

__name__函数:

获取类的名称,如果在模块中使用,获取模块的名称

__bases__函数:

获取某个类的所有父类,以元组的方式显示

class People():
# 实例方法
def eat(self):
print(self)
print('eating') # 类方法
@classmethod
def play(cls):
print(cls)
print('playing') # 静态方法:不需要第一个参数是self或cls
@staticmethod
def read():
print('reading') a = People()

调用实例方法:

a.eat()
People.eat()

实例方法只能用实例来调用

无法用类来调用

调用类方法:

a.play()
People.play()

类方法可以被类调用,也可以被实例调用

静态方法:

a.read()
People.read()

静态方法可以被类调用,也可以被实例调用

三种方法我认为最主要的不同点在于参数的问题。

因为我们所需求的参数不同,所以会去选择不同的方法来调用。

property

当我们想使用的成员属性不是我们想要的属性时,使用property属性,可以使数据变成我们想要的样子。

class People:
def __init__(self, name):
self.name = name def fget(self):
self.name = self.name.lower()
return self.name def fset(self, name):
self.name = name + '被修改' def fdel(self):
print('不能删除') name2 = property(fget, fset, fdel, '这个property')
a = People('ANN')
print(a.name)
print(a.name2)

显示结果:

ANN
ann

当显示a的name2属性时,会触发fget函数。

这样做就可以把所以的大写字母变成小写的字母,虽然调用函数也可以做到,但直接用以有的属性进行调用会减少代码的重复。

a.name2 = 'bee'
print(a.name)
print(a.name2)

显示结果:

bee被修改
bee被修改

当想要修改name2的值时,会触发fset函数

del a.name2

显示结果:

不能删除

当想要删除name2时,触发了fdel函数

我在这里想到的时,类的任何操作都是人来实现的,当你认为他写的函数不能满足你的开发需求时,

你就可以去修改他的方法,无论是print还是复制操作,都是一些封装好的函数,

而这些函数我们是可以进行修改的。

抽象函数

import abc
class People(metaclass=abc.ABCMeta): # 定义一个抽象的方法
@abc.abstractmethod
def eat(self):
pass #定义一个抽象类的方法
@abc.abstractclassmethod
def drink(cls):
pass # 定义一个静态抽象方法
@abc.abstractstaticmethod
def work():
pass

定义一个抽象类的目的:就是为了可以规范不同人的代码

使用抽象类注意的问题:

  • 抽象类中可以包含抽象方法,也可以包含具体方法
  • 抽象类中可以有方法,也可以有属性
  • 抽象类不能直接实例化
  • 子类可以不实现所有的抽象方法,这时子类则不能实例化。

python 类的魔法函数 内置函数 类方法 静态方法 抽象类的更多相关文章

  1. python类与对象的内置函数大全(BIF)

    关于类与对象的一些常用BIF(内置函数) 1.issubclass(class,classinfo) 含义:如果class是classinfo的子类,则返回True,否则返回false,用来判断子类关 ...

  2. python全栈开发-Day13 内置函数

    一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...

  3. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

  4. python 匿名函数&内置函数

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数怎么定义匿名函数: cal = lambda x : x*x # cal是函数名,lambda是定义匿名函数的关键字 冒号前面的额x是参数即函数 ...

  5. python基础12_匿名_内置函数

    一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...

  6. python成长之路八 -- 内置函数

    1,python内置函数     内置函数     abs() dict() help() min() setattr() all()  dir()  hex() next()  slice()  a ...

  7. 【python】dir(__builtins__)查看python中所用BIF(内置函数)

    dir(__builtins__)查看python中所用BIF(内置函数)

  8. 查看python内部模块命令,内置函数,查看python已经安装的模块命令

    查看python内部模块命令,内置函数,查看python已经安装的模块命令 可以用dir(modules) 或者用 pip list或者用 help('modules') 或者用 python -m  ...

  9. Python学习(八) —— 内置函数和匿名函数

    一.递归函数 定义:在一个函数里调用这个函数本身 递归的最大深度:997 def func(n): print(n) n += 1 func(n) func(1) 测试递归最大深度 import sy ...

  10. python学习 day013打卡 内置函数

    本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...

随机推荐

  1. cordova插件汇总

    1.获取当前应用的版本号 cordova plugin add cordova-plugin-app-version 2.获取网络连接信息 cordova plugin add cordova-plu ...

  2. 基于jQuery实现简单的js模块化

    在多人合作完成网页,经常遇到大家的js代码相互影响的问题.现在有许多模块化的前端框架,应该是可以解决这个问题.但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解 ...

  3. 使用FreeHttp强制登出微信公众号登陆状态(实现~原理)

    概述 我们使用的部分网站设计成一旦登录即不允许用户手动退出,现实场景中是没有问题的 但如果是在测试或调试过程中就会有强制登出的需求 如果当前使用的是PC浏览器,您或许可以通过调试模式清除保持登录信息的 ...

  4. 类System

    System类简介: 在 System 类中提供了大量的静态方法,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问:加载文件和库的方法:还有快速复制数组的一部分的实用方法. 常用方法 ...

  5. ecshop 商品属性显示方法

    功能:在商品列表上,点击放大镜,显示商品所有属性以及其价格,效果如下: 方法/步骤: 1.编辑\admin\templates\goods_list.htm 模板,在 <!-- 商品搜索 --& ...

  6. Java代理模式之Cglib代理

    Cglib代理,也叫做子类代理.在内存中构建一个子类对象从而实现对目标对象功能的扩展. CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类.不鼓励直接使用ASM,因 ...

  7. linux shell通配符及if语句判断

    $# 是传给脚本的参数个数 $0 是脚本本身的名字$1 是传递给该shell脚本的第一个参数$2 是传递给该shell脚本的第二个参数$@ 是传给脚本的所有参数的列表$* 是以一个单字符串显示所有向脚 ...

  8. reload ans current configure command

    reload ans current configure command enable_ans_license.conf enable ans license WL enable ans licens ...

  9. Eureka 配置

    #是否向服务注册中心注册自己,该值默认为trueeureka.client.register-with-eureka=falseserver端建议设为false #服务注册中心的配置内容,指定服务注册 ...

  10. gcc编译C源文件

    gcc编译C程序的主要过程是:预处理---编译---汇编---连接,其中:(以名为hello.c的源文件为例) 预处理:对各种预处理指令(#开头,如#include,#define)进行处理,以及删除 ...