首页 文章 精选 留言 我的

精选列表

搜索[全栈式内容安全],共10015篇文章
优秀的个人博客,低调大师

Python工程师 (类变量、方法、继承、覆盖)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 实例方法都是操作实例对象的 属于此类对象的方法 实例变量 添加/修改属性: 对象.属性名 = 表达式 删除: del 对象.属性名 类 | 对象 | 实例 class object instance 类的本质上也是对象 类可以创建此类对象 ----------------------------------------------------------------------------------------------------------------- 类: 类变量: 类变量是类的属性, 此属性属于类, 不属于此类的实例 作用: 通常用来储存该类创建的对象的共同属性 说明: 类变量可以通过该类的实例直接访问 类变量可以通过类的实例间接访问 类变量可以通过此类的对象__class__属性间接访问示例: # -*- coding:utf-8 -*- # 类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') print(Human.total_count) # 0 h1 = Human("zhang") print(h1.total_count) # 0 用此类实例访问类变量 h1.total_count = 100 # 为对象添加实例变量 print(h1.total_count) # 100 优先访问实例变量 print(Human.total_count) # 0 访问类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') h1 = Human("zhang") print(Human.total_count) # 0 h1.__class__.total_count = 100 # 为类添加修改实例变量 print(h1.total_count) # 100 间接访问类变量 print(Human.total_count) # 100 访问类变量 # 类变量的应用 用类变量记录实例个数 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') self.__class__.total_count += 1 # 每次创建对象调用__init__ 类变量加1 def __del__(self): self.__class__.total_count += 1 # 每次析构对象后类变量减1 h1 = Human("zhang") print("此时Human对象的个数是", Human.total_count) # 1 L = [] L.append(Human("li")) L.append(Human("zhao")) print("此时Human对象的个数是", Human.total_count) # 3 del h1 L.pop() print("此时Human对象的个数是", Human.total_count) # 1 类的文档字符串: 和函数等一样 用__doc__属性访问示例: >>> class Dog: ... '''这是小动物''' ... >>> help(Dog) >>> Dog.__doc__ '这是小动物' >>> 类 __slots__ 列表: 作用: 限定一个类的创建实例只能有固定的属性(实例变量) 不允许对象添加列表以外的属性(实例变量) 防止用户因错写属性的名称而发生错误 说明: 1.__slots__ 列表绑定一个字符串列表 2.含有__slots__列表的类所创建的实例对象没有__dict__属性 (不用字典储存对象的属性 __slots__限制) 示例: class Human: # 以下列表限制此类对象只能有这两个属性 防止出错 __slots__ = ["name", "age"] def __init__(self, name, age): self.name, self.age = name, age h1 = Human("Ta", 15) print(h1.age) # 15 h1.Age = 18 # 区分大小写 出错 没有Age属性,也不允许有 print(h1.age) # 15 类方法 @ classmethod 类方法是用于描述类的行为的方法 类方法属于类, 不属于类的实例 说明: 类方法需要使用 @classmethod装饰器定义 类方法至少有一个形参, 第一个形参用于绑定类, 约定写“cls” 类和该类的实例都可以调用类的方法 类方法不能访问此类创建的实例的属性示例: # 类方法的使用 class A: v = 0 @classmethod def get_v(cls): # cls 用来绑定调用此方法的类 return cls.v # 访问类变量 @classmethod def set_v(cls, value): cls.v = value print(A.get_v()) # 0 A.set_v(100) print(A.get_v()) # 100 a1 = A() # 创建实例 print("a1.get_v=", a1.get_v) # 100 a1.set_v(200) print("a1.get_v=", a1.get_v) # 200 print("A.get_v=", A.get_v) # 200 静态方法 @staticmethod 静态方法是定义在类内部的函数, 此函数的作用域是类的内部 说明: 静态方法需要使用 @staticmethod装饰器定义 静态方法与普通函数定义相同, 不需要传入self实例参数和cls参数 静态方法只能凭借该类的创建实例调用 静态方法不能访问变量和实例变量(属性)示例: # 静态方法 class A: @staticmethod def myadd(a, b): return a + b print(A.myadd(100, 200)) # 300 a = A() # 创建实例 print(a.myadd(300, 400)) # 700 # def myadd(a, b): # 和静态方法结果一样 # return a + b # class A: # pass # print(A.myadd(100, 200)) # 300 # a = A() # 创建实例 # print(a.myadd(300, 400)) # 700 实例方法, 类方法, 静态方法,函数, 小结: 1.不想访问 类内 的和 实例内 的变量, 用静态方法 2.只想访问类变量, 不想访问实例变量, 用类方法 3.既要访问类变量, 也想访问实例变量, 用实例方法 4.函数与静态方法相同, 只是静态方式的作用域定义在类内 继承inheritance/派生derive: 什么是继承/派生: 继承是从已有的类中派生出新的类, 新类具有原类的行为, 并能扩充新的行为 派生是从已有的类中衍生成新类, 在新类上可以添加新的属性和行为 作用: 用继承派生机制, 可以将一些共有的功能加在基类中, 实现代码的共享 在不改变基类的代码的基础上改变原有的功能 名词: 基类(base class) / 超类(super class)/父类(father class) 派生类(derived class)/子类(child class) 子类对象一定是父类对象的类型 父类对象不一定是子类对象的类型单继承: 语法: class 类名(基类名) 语句块 说明: 单继承是指由一各基类衍生出新的类 示例: # 单继承用法 class Human: # 人类的共性 def say(srlf, what): print("说:", what) def walk(self, distance): # 走路 print("走了", distance, "公里") class Student(Human): # 继承 # def say(srlf, what): # print("说:", what) # def walk(self, distance): # 走路 # print("走了", distance, "公里") def study(self, subject): # 派生 print("学习", subject) class Teacher(Student): def teach(self, subject): # 派生 print("教", subject) h1 = Human() h1.say("哈哈") h1.walk(500) s1 = Student() s1.walk(4) s1.say("666") s1.study("python") T1 = Teacher() T1.walk(4) T1.say("666") T1.teach("python") T1.study("Java") 继承说明: python3 任何类都可以直接或间接的继承object类 object类是一切类的超类(父类) class的继承参数不写, 默认继承object类 一般省略不写 object类的超类是None类的__base__属性: __base__ 属性用来记录此类的基类(父类)Python的内建类: help(__builtins__) 覆盖 override 覆盖是指在有继承关系的类中, 子类中实现了与基类同名的方法, 在子类 的实例调用该方法时, 实际调用的是子类的覆盖版本, 这种现象叫覆盖示例: # 覆盖 override class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") b = B() b.works() # B.works被调用 # B.works 覆盖 A.works 优先调用子类 # A派生B B继承A # 子类对象显示调用基类(被覆盖)方法的方式: # 基类.方法名(实例, 实际调用参数) A.works(b) # 用类名显示调用, A.works被调用 super 函数: super(cls, obj)返回绑定超类的实例(要求obj必须是cls类的实例) super() 返回绑定超类的实例, 等同于:super(__class__), 实例方法的第一个参数), 必须在方法内调用 作用: 借助于super()返回实例间接调用其父类的覆盖方法 # 用super函数返回的对象调用父类的覆盖方法 class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") def super_works(self): self.works() # B.works被调用 super(B, self).works() # A.works被调用 super().works() # A.works被调用 b = B() b.works() # B.works被调用 super(B, b).works() # A.works被调用 b = B() b.super_works() # B.works被调用 显示调用基类的初始化方法: 当子类中实现了__init__方法,基类的构造方法不会被调用 def __init__(self, ...) # 用super函数调用父类的覆盖__init__初始化方法 class Human: def __init__(self, n, a): self. name, self.age = n, a print("Human类的 __init__ 方法被调用") def infos(self): print("name:", self.name) print("age:", self.age) class Student(Human): def __init__(self, n, a, s=0): super().__init__(n, a) # 用siper 调用父类的__init__方法 self.score = s # 添加成绩属性 print("Student类的 __init__ 方法被调用") def info(self): super().infos() # 调用父类的方法 print("name:", self.name) print("age:", self.age) print("score:", self.score) # 不调用父类的方法也不会出错 但是尽量不要用 s1 = Student("小张", 20) s1.infos()

优秀的个人博客,低调大师

Python工程师(函数嵌套、变量作用域)

ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订阅吧灰常感谢 当个死粉也阔以 Python人工智能从入门到精通 globals()/locals()函数: globals()返回当前全局作用域内变量的字典 locals() 返回当前局部作用域内变量的字典函数变量: 函数名是变量,它在def 语句创建时绑定函数 fa1 = fa 没有括号 绑定函数 fa1 = fa() 返回结果 函数的变量名可以序列交换算法一个函数可以作为另一个函数的实参传递:例如: def myinput(fn): L = [5, 3, 1, 9, 7] return fn(L) print(myinput(max)) print(myinput(min)) print(myinput(sum)) print(myinput(len)) 函数可以作为另一个函数的返回值:例如: def get_op(): s = input("qing shu ru cao zuo") if s == "zui da": return max elif s == "zui xiao": return min elif s == "he": return sum L = [2, 3, 4, 6,5, 6, 9, 1] print(L) f = get_op() print(f(L)) 函数的嵌套: 函数嵌套定义是指一个函数里用def语句来创建其他的函数 示例: def fn_outter(): print("fn_outter被调用") def fn_inner(): print("fn_inner被调用") fn_inner() fn_inner() print("fn_outter调用结束") fn_outter() Python的作用域: 作用域也叫名字空间,是访问变量时查找变量的范围空间 python的4个作用域: 作用域: 英文解释 缩写 局部作用域(函数内) Local(function) L 外部嵌套函数作用域 Enclosing functio loc E 函数定义所在模块(文件)作用域 Global(module) G python内建模块作用域 Builtin(python) B 包含关系(内建>模块>外部嵌套函数>函数内)变量名查找规则: 访问变量时,先查找本地变量,然后是包裹此函数外的函数内部的变量 ,之后是全局变量,最后是内建变量 L ---> E ---> G ---> B 在默认情况下,变量名赋值会创建或者改变当前作用域的变量global语句: 告诉解释执行器global语句声明一个或多个变量, 这些变量的作用域为模块级别的作用域,也称为全局变量全局声明(global) 将赋值语句操作的变量映射到模块文件内部的作用域 语法: global 变量1, 变量2, .... 说明: 1. 全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是创建局部变量) 2. 全局变量在函数内部不经过声明就可以直接访问(变量已经存在并关联一个对象) 3. 不能先声明局部变量,再用global声明为全局变量,此做法不附合规则 4. global变量列表里的变量名不能出现在此作用域的形参列表里 nonlocal语句: 告诉解释执行器,nonlocal声明变量不是局部变量,也不是全局变量 它是外部嵌套函数变量 语法: nonlocal 变量名1,变量名2,... 说明: 1. nonlocal 语句只能在被嵌套的函数内部进行使用 2. 访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作 3. 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近的一层变量进行操作 4. nonlocal语句的变量列表里的变量名,不能出现在此函数的参数列表中 lambda表达式(又称匿名函数)(希腊字母:入) 作用: 创建一个匿名函数对象 同def类似 但是不提供函数名 格式: lambda[ 参数1, 参数...]: 表达式 说明: 1. lambda 只是一个表达式,它用来创建一个函数对象 2. 当lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用关系 3. lambda 表达式创建的函数只能包含一条表达式 4. lambda 比函数简单且可以随时创建和销毁,有利于减少程序的偶合度 函数: eval () / exec() 函数 eval(source, globals=None, local=None) 把一个字符串 srouce 当成一个表达式来执行,返回表达式执行的结果 exec(source, globals=None, locals=None) 把一个字符串source 当成程序来执行 练习: 写一个函数叫hello(name),部分代码如下: count = 0 def hello(name): print('你好', name) ... 此处代码省略,需要同学们自己填写 ... 此处代码需要改变全局变量来记录此函数曾经被调用过多少次. hello('小张') hello('小李') print('hello 函数被调用', count, '次') # 2次 count = 0 def hello(name): global count count += 1 print("hello", name) hello("name") hello("xiaoli") hello("xiaoliu") hello("xiaowei") hello("xiaozhang") 1. 写一个lambda 表达式,判断这个数的2次方+1是否能被5整除,如果能被整除返回True, 否则返回False 例: fa = lambda x: ..... print(fa(2)) # True print(fa(4)) # False fa = lambda x: (x ** 2 + 1) % 5 == 0 print(fa(2)) # True print(fa(4)) # False 2. 写一个lambda表达式,求两个变量的最大值 例如: def mymax(x, y): ... mymax = lambda ... print(mymax(100, 200)) # 200 def mymax(x, y): if x > y: return x else: return y print(mymax(100, 200)) # 200 mymax = lambda x, y: x if x > y else y print(mymax(100, 200)) # 200 1. 给出一个整数n,写一个函数myfac来计算n!(n的阶乘) n! = 1 * 2 * 3 * 4 * ..... * n 如: print(myfac(5)) # 120 def myfac(n): x = 1 for i in range(1, n + 1): x = x * i return x print(myfac(5)) 2. 给出一个整数n,写一个函数计算myfn(n): 1 + 2**2 + 3**3 + .... + n**n的和 如: print(myfn(10)) # ??? def myfu(n): s = 0 for x in range(2, n + 1): s += x ** x return s print(myfu(10)) 3. 完全数: 1 + 2 + 3 = 6 (6为完全数) 1,2,3都为6的因数(因数是能被一个数x整除的整数为y,则y为x的因数) 1 x 6 = 6 2 x 3 = 6 完全数是指除自身以外的所有因数相加之和等于自身的数 求 4~5个完全数并打印出来 答案: 6 28 496 ...... def mywqs(x): s = 0 L = [] for i in range(1, x): if x % i == 0: L.append(i) for i in L: s += i if s == x: return True else: return False i = 0 wqs = 0 while wqs < 5: i += 1 if mywqs(i) == True: print(i) wqs += 1 咳咳 又到了吹NB环节 locals()、globals() 就是一个查询函数 以字典形式返回信息而已函数变量? 你就就把它看做一个全局变量 变量绑定数据 而它绑定语句块 就这么简单什么是作用域? 作用域就是变量的所属范围 超过范围就失效 在别的地方一般是3个作用域 而python有4个 内建变量 局部变量 模块全局变量 特殊那个就是两个函数嵌套之间的范围(外部嵌套) 分别都是包含关系(内建>模块>外部嵌套函数>函数内) 内建函数 不可删除或修改 其他作用域 不能与内建函数重名 否则内建函数失效 只作用于当前空间自定义函数 各作用域各不相干 同空间不可重名 global 不管在任何空间使用global都直接声明全局变量 nonlocal 只能在被嵌套函数内部使用 多层嵌套 只会跳一层 lambda 用表达式创建一个函数 和if一样

优秀的个人博客,低调大师

Pyodide —— 在浏览器端实现 Python 科学计算

Pyodide 由编译成 WebAssembly 的 CPython 3.8 解释器组成,允许 Python 在网页浏览器中运行。 Pyodide 可以安装来自 PyPi 的任何 Python 包。Pyodide 还包括一个外部函数接口,可以将 Python 包暴露给 JavaScript,并将浏览器 UI,包括 DOM,暴露给 Python。该项目还使许多 Python 科学包,包括 NumPy、Pandas、Matplotlib、SciPy 和 Scikit-learn,就可以在浏览器中运行。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册