从0开始学Python

目录

一、基础知识点

为什么csdn电脑版不能自动保存,

这几天学的东西全没了,

就这样吧,此博卒!!!!!

四、序列

1、可在序列用的运算

2、转换

3、常用函数

五、字典和集合

字典

1、字典的创建

2、增、删、改、查

3、外部操作

集合

1、集合创建

2、对集合的处理

3、内置方法

哈希

 六、函数

1、创建和调用

2、函数的参数

3、变量的作用域

4、嵌套函数——在封闭函数中定义的函数

5、闭包(closure)

6、装饰器

7、匿名表达式(lambda)

8、生成器(将函数的return 换为yield)

9、递归

七、永久存储

1、文件的打开

2、文件对象的方法

3、pathlib——面向对象文件系统路径 from pathlib import Path

八、类和对象

1、封装

2、继承

3、多态

九、魔法方法

1、构造与解析


一、基础知识点

1.1变量

1.2字符串

1.3分支、循环

1.4数据类型(int,double,bool,转换) 

  • 运算

2f9d2081399d467eaf0e30f82969b5cf.png

  • bool

返回值为false:

  1. 定义为false的对象(none,false)
  2. 值为0的数据类型(0,0.0, Decimal(0) )
  3. 空的序列和集合('',[],set(),range())//含空格的字符串返回值为true

1.5操作符

  • 逻辑运算(and,or,not)

and与or返回值不一定是true或false:短路逻辑——从左到右只有第一个操作数的值无法确定最终结果,才对第二个操作数求职

       Eg: and4——4    0and4——0     3or4——3    0or4——4

  • 优先级

999ff7a175684072a951bba501ede38d.png

为什么csdn电脑版不能自动保存,

这几天学的东西全没了,

就这样吧,此博卒!!!!!

中间无了的就这样吧......再加点

四、序列

概念

可变:列表

不可变:元组、字符串

1、可在序列用的运算

  • ” + ” : 连接
(1,2,3) + (4,5,6)
>>>(1,2,3,4,5,6)
  • ” * “ : 重复
  • is VS is not 是否为同一对象
  • in VS not in 是否包含
  • del 删除对象
n = [1,2,3,4,5,6,7]
del n[5:6]            //[1,2,3,4,5]
del n[:]              //[]
del n                 //找不到列表

2、转换

  • list() 将可迭代对象转化为列表
print(list("HELLO"))    //['H', 'E', 'L', 'L', 'O']
print(list((1,2,3)))    //[1, 2, 3]
  • tuple() 将可迭代对象转化为元组
print(tuple("HELLO"))
print(tuple([1,2,3]))

//('H', 'E', 'L', 'L', 'O')
(1, 2, 3)
  • str() 将可迭代对象转化为字符串

3、常用函数

  • len() VS sum()
  • sorted() VS .sort() //排序,前者返回新的列表,s.sort()更改列表,且只能处理列表
s = ["apple","pen","happy"]
print(sorted(s))
print(sorted(s,key=len))
//['apple', 'happy', 'pen']
['pen', 'apple', 'happy']
  • reversed() VS .reverse()
  • all() VS any() //所以和任一
  • enumerate(可迭代对象,开始序号) //返回一个枚举对数,即一个二元组列表
s = ["apple","pen","happy"]
print(list(enumerate(s,3)))
//[(3, 'apple'), (4, 'pen'), (5, 'happy')]
  • zip() //聚合多个可迭代对象,以最短为主
x=[1,2,3]
y=[4,5,6,7]
z=zip(x,y)
print(list(z))
//[(1, 4), (2, 5), (3, 6)]
  • zip_longest() //import itertools 以最长为主
  • map() //运算指定的可迭代对象并返回所有结果,以最短为准
x = [1,2,3]
y = [2,2,3]
mapped = map(pow,x,y)
print(list(mapped))
//[1, 4, 27]
  • filter() //运算指定的可迭代对象并返回结果为TRUE的元素
  • iter() //迭代器

五、字典和集合

字典

概念:Python中唯一的映射类型。映射字(key)与值(value)

1、字典的创建

  • dict = {”key”: “value”} //大括号,冒号;建唯一,值不
  • dict(key=”value”) //键不能加引号
d = dict(F = "70",i = "105",C = "67")
print(d)
//{'F': '70', 'i': '105', 'C': '67'}
  • dict([(”key”,”value”)])
d = dict([("F","70"),("i","105"),("C","67")])
print(d)
//{'F': '70', 'i': '105', 'C': '67'}
  • dict({”key”: “value”})
d = dict({"F":"70","i":"105","C":"67"})
print(d)
//{'F': '70', 'i': '105', 'C': '67'}
  • dict({”key”: “value”},key1=”value1”)
  • dict(zip([”key”],[”value”]))
d = dict(zip(["F","i","C"],["70","105","67"]))
print(d)
//{'F': '70', 'i': '105', 'C': '67'}

2、增、删、改、查

  • fromkeys(iterable[,values]) //使所有键值都相同
d = dict.fromkeys("Hello", 22)        //初始化
print(d)
d['e']=10        //更改键值
print(d)
d['a']=22        //增加键、值
print(d)
//{'H': 22, 'e': 22, 'l': 22, 'o': 22}
{'H': 22, 'e': 10, 'l': 22, 'o': 22}
{'H': 22, 'e': 10, 'l': 22, 'o': 22, 'a': 22}
  • .pop(key[,defult]) //删除字典中元素,返回该键对应的值
d = dict.fromkeys("Hello", 22)
print(d)
print(d.pop('l'))
print(d.pop('i',"not in"))
print(d)
//{'H': 22, 'e': 22, 'l': 22, 'o': 22}
22
not in              //当删除的键不存在时,返回指定默认值
{'H': 22, 'e': 22, 'o': 22}
  • .popitem() //删除字典最后一个值
  • del d[’key’] ;del d //删除字典元素和删除字典
  • .clear() //清空字典内容
  • .update({’key’:value}) .update(key = ‘value’) //更改键值
d = dict.fromkeys("Hello")
print(d)
d.update({'H':1,'e':2})
print(d)
d.update(l='3',o='4',y='5')
print(d)
//{'H': None, 'e': None, 'l': None, 'o': None}          //键的唯一性
{'H': 1, 'e': 2, 'l': None, 'o': None}
{'H': 1, 'e': 2, 'l': '3', 'o': '4', 'y': '5'}
  • .get(key[,defult]) //查找key,返回对应的值;不存在设置默认值
  • .setdefult(key[,defult]) //不存在,即加入
d = dict.fromkeys("Helo")
print(d)
print(d.get('y',"None"))
print(d)
print(d.setdefault('y',"None"))
print(d)
//{'H': None, 'e': None, 'l': None, 'o': None}
None
{'H': None, 'e': None, 'l': None, 'o': None}
None
{'H': None, 'e': None, 'l': None, 'o': None, 'y': 'None'}

视图对象:当字典改变,其视图也跟着改变

  • .items() //键值对的视图对象
  • .keys() //键的视图对象
  • .values() //值的视图对象
d = dict.fromkeys("Enjoy",365)
i = d.items()
k = d.keys()
v = d.values()
print(d)
print(i)
print(k)
print(v)
//{'E': 365, 'n': 365, 'j': 365, 'o': 365, 'y': 365}
dict_items([('E', 365), ('n', 365), ('j', 365), ('o', 365), ('y', 365)])
dict_keys(['E', 'n', 'j', 'o', 'y'])
dict_values([365, 365, 365, 365, 365])
  • .copy() //浅拷贝

3、外部操作

  • len()
  • in || not in
  • list() //list(d) keys对应的列表; list(d.values()) values对应的列表
  • reversed() //逆序(3.8版以后才行)
  • 嵌套
d = {"ABC":{"A":65,"B":66,"C":67},"DEF":{"D":68,"E":69,"F":70}}
print(d)
print(d["ABC"]["B"])                //[外key][内key]
d = {"ABC":[65,66,67],"DEF":[68,69,70]}
print(d)
print(d["ABC"][1])                  //[外key][内索引]
//{'ABC': {'A': 65, 'B': 66, 'C': 67}, 'DEF': {'D': 68, 'E': 69, 'F': 70}}
66
{'ABC': [65, 66, 67], 'DEF': [68, 69, 70]}
66
  • 字典推导式
d = {"A":65,"B":66,"C":67,"D":68,"E":69,"F":70}
print(d)
exch = {v:k for k,v in d.items()}          //交换键值
print(exch)
d1 = {n : ord(n) for n in "Phone"}         //生成字典
print(d1)
//{'A': 65, 'B': 66, 'C': 67, 'D': 68, 'E': 69, 'F': 70}
{65: 'A', 66: 'B', 67: 'C', 68: 'D', 69: 'E', 70: 'F'}
{'P': 80, 'h': 104, 'o': 111, 'n': 110, 'e': 101}

集合

概念:集合中所有元素都是唯一的。无序性

1、集合创建

  • {“元素1”,”元素2”,”元素n”}
  • 推导式{ s for s in “String”}
  • set{”String”}
s = {"Hello","World"}
print(s)
s1 = {s for s in "Evian"}
print(s1)
s2 = set("Great")
print(s2)
//{'World', 'Hello'}
{'a', 'v', 'i', 'E', 'n'}
{'t', 'a', 'r', 'G', 'e'}

2、对集合的处理

  • 因为无序,不能访问下标
  • in || not in
  • 去重 set([])
l = [1,1,2,4,3,6,1]
print(l)
s = set(l)
print(s)
//[1, 1, 2, 4, 3, 6, 1]
{1, 2, 3, 4, 6}

s = "talented"
print(s)
s = set(s)
print(s)
//talented
{'t', 'n', 'd', 'a', 'l', 'e'}

3、内置方法

集合(s).方法名等价符号方法说明
s.isdisjoint(t)判断s和t是否存在交集
s.issubset(t)s <= t子集测试(允许不严格意义上的子集):s 中所有的元素都是 t 的成员
s < t子集测试(严格意义上):s != t 而且 s 中所有的元素都是 t 的成员
s.issuperset(t)s >= t超集测试(允许不严格意义上的超集):t 中所有的元素都是 s 的成员
s > t超集测试(严格意义上):s != t 而且 t 中所有的元素都是 s 的成员
s.union(t)st
s.intersection(t)s & t交集操作:s "与" t 中的元素
s.differences - t差分操作:在 s 中存在,在 t 中不存在的元素
s.symmetric_difference(t)s ^ t对称差分操作:s "或" t 中的元素,但不是 s 和 t 共有的元素
s.copy()返回 s 的拷贝(浅复制)
以下方法仅适用于可变集合
s.updates= t
s.intersection_update(t)s &= t交集修改操作:s 中仅包括 s 和 t 中共有的成员
s.difference_update(t)s -= t差修改操作:s 中包括仅属于 s 但不属于 t 的成员
s.symmetric_difference_update(t)s ^= t对称差分修改操作:s 中包括仅属于 s 或仅属于 t 的成员
s.add(obj)加操作:将 obj 添加到 s
s.remove(obj)删除操作:将 obj 从 s 中删除,如果 s 中不存在 obj,将引发异常
s.discard(obj)丢弃操作:将 obj 从 s 中删除,如果 s 中不存在 obj,也没事儿^_^
s.pop()弹出操作:移除并返回 s 中的任意一个元素
s.clear()清除操作:清除 s 中的所有元素

符号运算时左右类型要相等

s = set("talented")
t = set("girl")
print(s.union(t))          //等价于print( s | t )
print(s.intersection(t))   //等价于print( s & t )
//{'r', 'e', 'g', 'd', 'i', 'a', 'n', 't', 'l'}
{'l'}
s = set("girl")
print(s)
s.update("789",[2,3,2])    //以单个集合元素插入
s1 = s
print(s1)
s.add("657")             //以字符串插入
print(s)                //输出的s是更新后的集合
//{'i', 'r', 'l', 'g'}
{'g', 2, '8', 3, 'r', 'l', 'i', '9', '7'}
{2, 3, '8', 'r', '9', 'i', '657', 'l', 'g', '7'}

updata方法是没有返回值的(返回值为None),不能直接赋值返回值给变量

哈希

  • hash(object) //获取对象hash值

    • 整数的哈希值是本身
    • 两个对象值相等,其哈希值也相等
    • Python中不可变对象可哈希,可变对象不可哈希
    • 可哈希对象才能创建字典和集合
  • frozenset() //将可变对象不可变

x = {1,2,3}
print(x)
x = frozenset(x)
print(x)
y = {x,4,5}
print(y)
//{1, 2, 3}
frozenset({1, 2, 3})
{frozenset({1, 2, 3}), 4, 5}

 六、函数

概念

打包代码,实现代码重用,减少冗余代码

将不同功能代码封装,降低结构复杂性,提高代码可读性

1、创建和调用

  • 定义:def myfunc(): 函数体

     调用:myfunc()
    
def cnt():
    for i in range(3):
        print("The num is ",i)
cnt()
//The num is  0
The num is  1
The num is  2

2、函数的参数

  • 位置参数(参数位置固定) ——斜杠左侧只能使用位置参数 :sum(x,/,y),x只能是位置参数,不能进行赋值和关键字,y则可以赋值
def fun(name,times):
    for i in range(times):
        print(f"The nam is: {name}")
fun("Neo",3)
//The nam is: Neo
The nam is: Neo
The nam is: Neo
  • 关键字参数,只要参数名对应就行,无论位置 ——*右侧只能是关键字参数
def fun(s,vt,o):
    return "".join((o,vt,s)) 
s1 = fun("cat ","eat ", "fish ")          //s——cat
print(s1)
s = fun(s = "fish ",vt = "eat ", o = "cat ")     //s——fish
print(s)

//
fish eat cat       //s——cat
cat eat fish       //s——fish

如果位置参数和关键字参数混用,位置参数在关键字参数之前

  • 默认参数——定义在形参最后
  • 函数的返回值
def fun():
    pass             //占位
    return "Haha,Nothing"
z = fun()
print(z)
//Haha,Nothing

//返回运算
def add(x,y):
    return x+y
print(add(4,8))
//12
  • 参数的打包与解包
  • 打包——元组; 形参加*
def fun(*args):
    print(args)
fun(1,2,3,4,"end")
//(1, 2, 3, 4, 'end')

若要传入其他参数,只能用关键字传入

def fun(*args,a,b):
    print(args,a,b)
fun(1,2,3,a = "y",b = "n")
//(1,2,3) y n

以字典打包,必须用关键字参数;加**

def fun(**key):
    print(key)
fun(l=5,y=3,z=9)
//{'l': 5, 'y': 3, 'z': 9}
  • 解包——用元组内容赋值
def fun(*args):
    return 1,2,3
x,y,z = fun()
print(x,y,z)
//1 2 3

3、变量的作用域

局部变量和全局变量

  • global //声明为全局变量

4、嵌套函数——在封闭函数中定义的函数

不能直接调用内部函数,若内部函数有返回,嵌套函数的外层作用域会被保留

  • nonlocal //内部函数修改外部函数
  • LEGB规则——Local(局部),Enclosed(嵌套函数的外层),Global(全局),Build-In(内置作用域),地位由高到低

5、闭包(closure)

def power(exp):
    def exp_of(base):
        return base **exp
    return exp_of
square = power(3)        //exp_of()的函数继承外层的,exp = 2
cube = power(2)          //exp = 3
print(square(3),cube(2))
//9 8

6、装饰器

详解https://blog.csdn.net/m0_51971452/article/details/111757163?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165709407416781818779496%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165709407416781818779496&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-3-111757163-null-null.142%5Ev31%5Epc_search_result_control_group,185%5Ev2%5Econtrol&utm_term=python%E8%A3%85%E9%A5%B0%E5%99%A8&spm=1018.2226.3001.4187

#运行日志
import time
from tracemalloc import stop
def time_master(func):
    def call_func():
        print("Starting")
        start = time.time()
        func()
        stop = time.time()
        print("Ending")
        print(f"spend {(stop-start):.3f}s")
    return call_func
@time_master         #不使用语法糖(注意位置)myfunc = time_master(myfunc)       myfunc被赋值为call_func
def myfunc():
    time.sleep(1)
    print("Just be happy")
myfunc()
  • 带参数的语法糖

    @最外层函数名(对最外层变量赋值) == 调用的函数 = 最外层函数(对最外层变量赋值)(调用的函数名) 先调用扔参数,再调用扔函数

#运行日志
import time
def time_master(func):
    def call_func():
        print("Starting")
        start = time.time()
        func()
        stop = time.time()
        print("Ending")
        print(f"spend {(stop-start):.3f}s")
    return call_func
@time_master         #不使用语法糖(注意位置)myfunc = time_master(myfunc)       myfunc被赋值为call_func
def funA():
    time.sleep(1)
    print("Just be happy")
funA()
def funB():
    time.sleep(2)
    print("Relax")
funB()

7、匿名表达式(lambda)

一个表达式而非语句,支持单个函数表达式、列表、闭包

  • lambda arg1,arg2,arg3,…argn : expression //lambda 参数 : 返回值
y = [lambda x : x*x,1,2,3]
for i in range(1,len(y)):
    print(y[0](y[i]))     //切片y[0]()引用一个函数,参数用切片的下标赋值
//
1
4
9
  • 与map()
M = map(lambda x: ord(x),"Hert")
print(list(M))
#def M(x):
#    return ord(x)
#print(list(map(M,"Hert")))
//[72, 101, 114, 116]

8、生成器(将函数的return 换为yield)

每次调用提供一个数据,并记住当前状态;不走回头路,每次调用都加1,不能使用下标索引

  • 生成器表达式,一次只产生一个推导 (列表推导式一次产生所有结果)

9、递归

结束条件、向结束条件靠近的变量表达式

def result(n):
    if n==1:
        return n
    else:
        return n*result(n-1)
print(result(4))
//24
#迭代
def result(n):
    r = n
    for i in range(1,n):
        r *=i
    return r
print(result(4))
  • 汉诺塔
#汉诺塔步骤
def Hano(n,x,y,z):
    if n==1:
        print(x,'-->',z)
    else:
        Hano(n-1,x,z,y)        #将x上的n-1移动到y
        print(x,'-->',z)       #将最下面从x到z
        Hano(n-1,y,x,z)        #将y上的n-1移动到z
n = int(input("请输入层数: "))
Hano(n,'A','B','C')
  • 高阶函数

    • map(); filter(); min(); max(); salty()
  • functools模块

    • .reduce(),连续执行可迭代对象的元素
    import functools
    def add(x,y):
        return x+y
    print(functools.reduce(add,[1,2,3]))
    //6
    
    • .partial()偏函数(对函数2次包装,即将函数的参数多次拆分进行传递)
    • @functools.wraps(外函数函数名)装饰器(用于装饰装饰器,保持被装饰函数的函数名不变)

七、永久存储

文件:.exe可执行文件 .txt文本文件

1、文件的打开

mode: 读(r)、写(w)、追加(a)等

2、文件对象的方法

方法含义
file.close()关闭文件
file.flush()将缓存区数据写入文件(不一定有效)
file.read(size=-1)从文件读取 size 个字,当未指定size或值为负数,读取剩余所有并以字符串返回
file.readline(size=-1)从文件中读取并返回一行(包括行结束符), 或返回最大 size
file.readlines(sizhint=0)读取文件的所有行并作为一个列表返回(包含所有的行结束符)
file.tell()返回当前文件指针所在位置
file.seek(off, whence=0)在文件中移动文件指针, 从 whence ( 0 代表文件其始, 1代表当前位置, 2 代表文件末尾)偏移 off 字节;以字节为单位,返回最新的索引位置
file.truncat()截断数据,清除文件指针之后的数据(单独以w打开也会截断)

3、pathlib——面向对象文件系统路径 from pathlib import Path

方法含义
Path.cwd()获取文件当前路径
.is_dir()判断路径对象是否为文件夹
文件.parent获取文件上一级路径
name目录的最后一个部分
stem目录的最后一个部分,无后缀
suffixes返回多个扩展名列表
.resolve()将相对路径转化为绝对路径
.iterdir()获取当前路径子文件
  • with上下文管理器 //不用再关闭文件
  • pickle() //将Python转化为二进制字节流

八、类和对象

类(class):模具 对象:属性+方法

class Dog:           #类首字母大写
    foot = 4         #属性

    def run(self):      #方法,设置默认参数
        print("Fast")
#调用
pup = Dog()
a = pup.name = "Joe"  #添加属性
print(a)  
print(pup.foot)
pup.run()
//Joe
4
Fast

1、封装

在创建对象之前将相关属性和方法打包

2、继承

子类与父类、基类、超类 子类与父类属性和方法名,子类覆盖父类

class P:
    x = 305
    def what(self):
        print("305 is a birthday")
class C(P):
    x = 22
    y = 520
c = C()
print(c.x)
print(c.y)
c.what()
//22
520
305 is a birthday
  • isinstance() #判断是否为继承关系
  • issubclass() #检查是否为子类
  • 多重继承 #一个子类可继承多个父类,多代父类
  • 组合
class Cat():
    def say(self):
        print("喵喵~")
class Dog():
    def say(self):
        print("汪汪~")
class Bird():
    def say(self):
        print("啾咪~")
class Pats:
    c = Cat()
    d = Dog()
    b = Bird()
    def say(self):
        print("The pats start to sing")
        self.c.say()         #self将实例对象与类的方法绑定,防止方法共享
        self.d.say()
        self.b.say()
h = Pats()
h.say()
//The pats start to sing
喵喵~
汪汪~
啾咪~
  • .dict #查看一个类的属性
  • 构造函数 *init*() #双下划线
class C:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def sum(self):
        print(self.x + self.y) 
    def mul(self):
        print(self.x * self.y) 
c =C(2, 3)
c.sum()
C(2,3).mul()
print(c.__dict__)
//5
6
{'x': 2, 'y': 3}
  • 重写 //调用未绑定的父类方法
class C:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def add(self):
        return self.x + self.y 
    def mul(self):
        return self.x * self.y
class D(C):
    def __init__(self, x, y,z):        #等价于self.x =x    self.y = y
        C.__init__(self,x, y)        #换为super().__ini__()可以避免重复调用
        self.z = z
    def add(self):
        print(C.add(self) + self.z) 
D(2,3,4).add()
//9
  • .mro() .mro // 查看MRO顺序(方法解析顺序(Method Resolu orde))
  • Mixin 混入 。可复用性;方法和参数在各组件中不共;值为对象的选项,选项会被合并,键冲突的组件会覆盖混入对象的;值为函数的选项,就会被合并调用,混合对象里的钩子函数在组件里的钩子函数之前调用

3、多态

一类事物有多种形态。同一运算符、函数、对象在不同场景的不同作用

  • 一类方法被多种实例使用
import math
class Shape:
    def __init__(self,name):
        self.name = name
    def area(self):
        pass
class Square(Shape):
    def __init__(self, length):
        super().__init__("正方形")
        self.length = length
    def area(self):
        print( self.length*self.length)
    def Girth(self):             #正方形自己的方法求周长
        print(4*self.length)
class Circle(Shape):
    def __init__(self, radius):
        super().__init__("圆形")
        self.radius = radius
    def area(self):
        print(self.radius*self.radius*math.pi)
s = Square(3)
c = Circle(5)
print(s.name)
s.Girth()
c.area()
//正方形
12
78.53981633974483
  • 多态性:指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。增加了程序的灵活性和可拓展性
#抽象
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class Cat(Animal): #动物的形态之一:猫
    def talk(self):
        print('say miaomiao')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('say aoao')

c = Cat()
d = Dog()
p = Pig()

def func(obj):
    obj.talk()

func(c)
func(d)
func(p)
  • __x两个下横线开头的变量/函数——“私有变量”
  • 单个下横线开头 或 单个下横线结尾 // 仅供内部使用
  • slots 固定字典空间。防止动态添加;继承自父类的__slots__属性不被子类使用

九、魔法方法

被双下划线前后包围的方法。在类或对象进行特定的操作时会自动被调用,我们可以使用或重写这些魔法方法,给自定义的类添加各种特殊的功能来满足自己的需求。

1、构造与解析

  • init(self[,…]) 初始化
  • new(cls[,…]) 创建实例和对象,比__init__先执行 //可更改不可变对象
class S(str):
    def __new__(cls,string):
        string = string.upper()
        return super().__new__(cls,string)
c = S("Evian")
print(c)
print(c.lower())
//EVIAN
evian
  • del(self) 当对象被销毁时触发的魔法方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值