Python心经(5)

news2024/11/25 14:22:31

目录

python对于类和实例,,都能随时动态绑定 属性或者函数 

可以通过__slots__去限定实例所能绑定属性的范围

python里面类很多定制函数__xx__

下面给个python里面枚举类型

对type函数去实现

有关迭代器:

生成器:

 可迭代对象:

有关python继承你需要了解

python对于类和实例,,都能随时动态绑定 属性或者函数 

print('ABC'.lower())

class TT(object):
    pass

def func(self,arg):
    self.arg=arg
    print(self.arg)
#python这个动态语言允许,在运行时给类或者实例去绑定新的属性/函数
#对这个类绑定了func,就相当于在TT类里面实现了一个func函数
#这是其他静态语言所不允许的
TT.func=func
TT.func(TT(),5)
t=TT()
t.func(6)

注意属性并不是一定需要的,,可有可无,只是稍微简单了一下代码 

可以通过__slots__去限定实例所能绑定属性的范围

但是对于类本身来说没什么区别,,想添加属性也是可以的

#如果想对实例的属性做限制 可以用__slots__
class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

#实例一个Student对象
s=Student()
s.socre=50 #不可以,,类做了限制,,实例绑定属性只能绑定name和age
s.age=0
s.name='sad'

Student.socre=10 #但是对于类本身来说没什么区别,,想添加属性也是可以的
print(Student.socre)
print(Student.age)

注意 __slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

class boy(Student):
    pass
bo=boy()
bo.socre=50
print(bo.socre)

这样是ok的, 想要再限制,那就在子类做__slots__限制

对于python来说私有 就是在前面加__两个杠去表示,属性啊,方法,变量等等都可以用

继承的话,子类没法继承父类的私有的东西,就没法直接使用

对于 非要想在外部去使用私有的东西,方法如下:_xx.__私有 ,不建议 

如果想要对函数参数做检查,一般写起来函数内部比较麻烦,需要搞个set,get方法,,使用@property装饰器,可以把方法变为属性调用

把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

class Student(object):
    
    @property
    def socre(self):
        return self._socre
    
    @socre.setter
    def socre(self,value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._socre = value

s=Student()
s.socre=60  #方法当作属性去调用了 s.set_socre(60)
print(s.socre) #其实就是s.get_socre()
class Student(object):

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2015 - self._birth

s=Student()
s.birth=15
print(s.age)

Python内置有三大装饰器:@staticmethod(静态方法)、@classmethod(类方法)、@property(描述符),其中静态方法就是定义在类里的函数,并没有非要定义的必要;类方法则是在调用类属性、传递类对象时使用;而@property则是一个非常好用的语法糖。@property最大的好处就是在类中把一个方法变成属性调用,起到既能检查属性,还能用属性的方式来访问该属性的作用。

可以通过装饰器去访问到类的私有成员

@property应用
  让我们先看下@property的应用,其功能1是可定义只读属性,也就是真正意义上的私有属性(属性前双下划线的私有属性也是可以访问的,具体参照这篇文章:私有属性真的是私有的吗?)。实例需求是定义类Person,具有年龄和姓名,要求年龄必须等于18,则代码如下:

class Person(object):
    def __init__(self, name, age=18):
        self.name = name
        self.__age = 18

    @property
    def age(self):
        return self.__age
        
xm = Person('xiaoming')  #定义一个人名小明
print(xm.age)    #结果为18
xm.age = -4    #报错无法给年龄赋值
print(xm.age)



  在python中定义只读属性非@property莫属,如果细心留意大部分源码,都跑不了@property的身影。而定义只读属性也很简单:以需要定义的属性为方法名(上例age属性定义为方法),其上装饰内置装饰器@property就ok了。
  @property真正强大的是可以限制属性的定义。往往我们定义类,希望其中的属性必须符合实际,但因为在__init__里定义的属性可以随意的修改,导致很难实现。如我想实现Person类,规定每个人(即创建的实例)的年龄必须大于18岁,正常实现的话,则必须将属性age设为只读属性,然后通过方法来赋值,代码如下:

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.__age = 18

    @property
    def age(self):
        return self.__age

    def set_age(self, age): #定义函数来给self.__age赋值
        if age < 18:
            print('年龄必须大于18岁')
            return
        self.__age = age
        return self.__age
     
     xm = Person('xiaoming', 20)
     
print(xm.age)
print('----------')
xm.set_age(10)
print(xm.age)
print('----------')
xm.set_age(20)
print(xm.age)


  可以看到,通过方法的确能限制输入,但是不是每个人都记得方法名,有什么简化的方法呢?@property就能很轻松办到,修改代码如下:

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.__age = 18

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        if age < 18:
            print('年龄必须大于18岁')
            return
        self.__age = age
        return self.__age

xm = Person('xiaoming', 20)
print(xm.age)
print('----------')
xm.age = 10
print(xm.age)
print('----------')
xm.age = 20
print(xm.age)

  结果和上图一致。两段代码变化的内容:将set_age修改为age,并且在上方加入装饰器@age.setter。这就是@property定义可访问属性的语法,即仍旧以属性名为方法名,并在方法名上增加@属性.setter就行了。
 

python里面类很多定制函数__xx__ 

这里不说了

向打开文件的with方法,内部就是封装了相对的__enter__和__exit__ 

下面给个python里面枚举类型

下面是用enum函数去创建枚举类,也可以自己写类去继承Enum,去实现一个枚举类

from enum import Enum

Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
    print(name, '=>', member, ',', member.value)

type()函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object)...的定义:

对于这个类:

class Hello(object):
    def hello(self, name='world'):
        print('Hello, %s.' % name)
  

对type函数去实现

def fn(self, name='world'): # 先定义函数
     print('Hello, %s.' % name)


Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
h = Hello()
h.hello()

print(type(Hello))
print(type(h))

要创建一个class对象,type()函数依次传入3个参数:

  1. class的名称;
  2. 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
  3. class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。

通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。

有关迭代器:

生成器:

 可迭代对象:

执行__iter__返回了迭代器对象或者生成器对象,之后就进到迭代器或者生成器,,然后自动调__next__,这样就是达到了for循环。 python的for循环 或者range或者常见的数据类型比如list,元组,字典等等 对象其实都是返回可迭代对象,都是可以迭代的。

有关python继承你需要了解

 但是对于复杂的继承关系,我们可以通过mro方法去获得这个类的继承关系

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux编译器gcc/g++】带你了解代码是如何变成可执行程序的!

Linux编辑器gcc/g的使用 背景知识gcc的使用预处理&#xff08;进行宏替换&#xff09;编译(生成汇编)汇编(生成及其可识别代码)链接(生成可执行文件或者库文件)库 动态库vs静态库 debug和release&#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x…

【FPGA零基础学习之旅#6】ip核基础知识之计数器

&#x1f389;欢迎来到FPGA专栏~ip核基础知识之计数器 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家…

[网络工程]小型局域网组建的常用命令(ENSP)

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 目录 1、引言2、常用命令(ENSP)常规VTYConsole端口安全单臂路由DHCPNATACL基础ACL高级ACL GVRPSTP 1、引言 局域网&#xff08;Local A…

C++学习——第一节课-初识C++

大家好&#xff0c;我是涵子。今天我们来开始学习C。 目录 一、课前准备 二、C的第一个程序 2.1.C是个啥 2.2.C的第一个程序编写 2.2.1.头文件 2.2.2.命名空间 2.2.3.主程序函数 2.2.4.输出流 2.2.5.代码结束 三、其它的应用 3.1.输出三角形&#xff0c;矩形和勾 …

单例模式C++实现和观察者模式C++实现

目录 1、单例模式介绍 2、单例代码实现 2.1 static介绍 2.2 C中static的三种用法&#xff1a; &#xff08;1&#xff09;静态局部变量 &#xff08;2&#xff09;静态成员变量 &#xff08;3&#xff09;静态成员函数 3、观察者模式介绍 4、观察者代码实现 1、单例模…

.ini配置文件介绍与解析库使用

【前言】 ini 文件是英文"Initialization"的缩写&#xff0c;即初始化文件。它用来配置特定应用软件以实现对程序初始化或进行参数设置。.ini文件由节(section)、键(key)、值(value)三种模块构成。在windows系统/嵌入式软件中有很多XXX.ini文件&#xff0c;例如Syste…

IDC机房相电压与线电压的关系

380V电动机&#xff08;三相空调压缩机&#xff09;的电流计算公式为&#xff1a;Ⅰ&#xff1d;额定功率&#xff08;1.732额定电压功率因数效率&#xff09;。 功率因数是电力系统的一个重要的技术数据。功率因数是衡量电气设备效率高低的一个系数。功率因数低&#xff0c;说…

通过源码编译安装搭建 LNMP平台

搭建LNMP平台 一. 安装Nginx服务1.1 安装依赖包1.2 创建运行用户1.3 编译安装1.4 优化路径1.5 添加 Nginx 系统服务 二. 安装mysql服务2.1 安装Mysql环境依赖包2.2 创建运行用户2.3 编译安装2.4 修改mysql 配置文件2.5 更改mysql安装目录和配置文件的属主属组2.6 设置路径环境变…

VMware安装Windows11

VMware安装Windows11 嘚吧嘚准备工作VMware下载Windows11下载 VMware安装Windows11VMware配置安装Windows11 嘚吧嘚 最近在搞一些自己感兴趣的东西&#xff0c;需要(临时)安装一些软件来验证&#xff0c;考虑到用完还要卸载&#xff0c;不想把自己的电脑搞得乱七八糟&#x1f…

字节序及IP地址转换

一、主机字节序和网络字节序 1.什么是字节序&#xff1f; 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序&#xff0c;分为&#xff1a;大端字节序&#xff08;Big endian&#xff09;、小端字节序&#xff08;Little endian&#xff09;。 示例&am…

前端技术双周刊 2023-06-04:React 发布 10 周年整

项目地址&#xff1a;olivewind/weekly 微信公众号&#xff1a;依赖注入 发布时间&#xff1a;2023.06.04 本周内容&#xff1a;资讯x3、开源x4、文章x5 动态 React 圆桌会议 - Server Components, Suspense 和 Actions 为庆祝 React 成立 10 周年&#xff0c;Delba de Oliveir…

MySQL 约束控制

文章目录 约束控制非空约束主键约束默认值约束唯一约束外键约束 约束控制 数据的完整性约束&#xff08;简称“约束”&#xff09;是在表和字段上强制执行的数据检测规则&#xff0c;是为了防止不规范的数据进入数据库。当我们对数据进行 DML 操作时&#xff0c;数据库管理系统…

被面试官上过一课后,我学到的不止是如何答题

写在前面双向奔赴切勿急于否定自己做足功课关于简历关于简历投递常见面试题汇总● 按照一般的面试流程&#xff0c;先来一个自我介绍吧● 你的优点和缺点是什么● 你理解的项目经理是干什么的● 能完整的说一下软件项目的整个流程么● 项目经理和产品经理的区别在哪里● 项目管…

UniAD:实现多类别异常检测的统一模型

来源&#xff1a;投稿 作者&#xff1a;Mr.Eraser 编辑&#xff1a;学姐 论文标题&#xff1a;用于多类异常检测的统一模型 论文链接&#xff1a;https://arxiv.org/abs/2206.03687 论文贡献&#xff1a; 提出UniAD&#xff0c;它以一个统一框架完成了多个类别的异常检测。 …

Jetson 硬件 安装SSD固态作为启动盘以及安装CUDA等

Jetson硬件的自带闪存一般较小&#xff0c;只能安装jetpack等基本的环境&#xff0c;所以需要额外增加SSD固态或SD卡作为存储空间&#xff0c;很明显SSD的读取速度远远大于SD卡&#xff0c;所以为更好发挥出Jetson 的计算性能&#xff0c;我们选择使用SSD固态作为存储 1. 安装…

随机森林原理和性能分析

文章目录 随机森林入门构造随机森林随机森林性能随机森林特点 随机森林入门 决策树入门、sklearn实现、原理解读和算法分析中针对决策树进行了详细的描述&#xff0c;但是其只考虑了一颗决策树的情况。俗话说&#xff0c;三个臭皮匠&#xff0c;顶个诸葛亮。本文将研究如何通过…

C++:深入理解多态,多态实现原理及拓展

文章目录 1. 理解虚表1.1 虚表1.2 验证1.3 子类虚表1.4 相同类不同对象的虚表 2. 静态绑定和动态绑定2.1 静态绑定2.2 动态绑定 3. 多态的实现原理3.1 向上转型3.2 多继承3.3 原理 4. 拓展4.1 构造函数能不能是虚函数4.2 父类和子类的析构函数在底层的命名问题4.3 对象之间无法…

[论文阅读] (30)李沐老师视频学习——3.研究的艺术·讲好故事和论点

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

SpringMVC第十一阶段:SpringMVC 拦截器执行源码解析

SpringMVC 拦截器执行源码解析&#xff1a; 1、执行doDispatcher做请求分发处理 1.1、调用getHandler()获取请求处理器&#xff0c;处理器中包含请求的方法和拦截器信息 getHandlerInternal() 根据请求地址获取对应的目标方法getHandlerExecutionChain() 获取请求地址对…

(转载)基于鱼群算法的函数寻优算法(matlab实现)

1 理论基础 1.1 人工鱼群算法概述 人工鱼群算法是李晓磊等人于2002年提出的一类基于动物行为的群体智能优化算法。该算法是通过模拟鱼类的觅食、聚群、追尾、随机等行为在搜索域中进行寻优&#xff0c;是集群体智能思想的一个具体应用。生物的视觉是极其复杂的&#xff0c;它…