Python语法进阶之路

news2024/9/22 20:48:59

一、Python基础

1.1 注释

定义和作用

对代码解释说明,增强可读性

单行注释

#

多行注释

"""

这是一个多行注释

""" 

1.2 变量及变量类型 

定义和作用

计算机目的是计算,编程是为了更方便计算,计算对象就是变量,可以在程序运行过程中,临时存储数据 

变量基本使用

变量初始化

变量名  =  变量值 

a = 200

a = 100        变量值可以变化

b = 100

c = 300

d = b + c        变量可以运算

print(变量名)        直接调用即可输出 

遇到不同类型的数据怎么办,怎么用变量来存储?
例如

  • 小伙的名字叫鲁班
  • 今年18岁
  • 身高一米半半
  • 是个纯爷们儿

name = "鲁班"
age =18
height = 1.55
is_man = True

变量是什么类型的,取决于它储存的数据的类型,常用的数据类型有:

  • 数字 number: 其中整数 int, 浮点数 float
  • 字符串 str (也叫 string)
  • 布尔类型 bool (也叫 boolean)
  • 列表 list
  • 元组 tuple
  • 字典 dict

# 可以使用type()函数,来获得数据的类型

print(type(1))
print(type(name)) 

 1.3 标识符和关键字

什么是标识符
标识符就是程序中用来标识变量,函数,类或其他对象的名字
标识符的命名规则

  • 只能包含字母,数字,下划线,中文(不推荐)
  • 不能以数字开头区分大小写 (如 Andy 和 andy 是不同的标识符)
  • 不能是python的关键字 (关键字是Python已经使用的有特殊功能的标识符)。

 变量命名规范
变量名应简短而有意义,如: name="张三",尽量别用 a="张三'单词使用小写字母,多个单词用下划线分割,如 total sum,user name

文件的命名和函数的命名都可以参照这种规范,后续类的命名会有一点区别

1.4 输入和输出 

对输入和输出的理解

  • 生活中,例如去ATM取款你的卡,输入的密码和金额, 都是输入,ATM机吐的卡和钱都是输出
  • 软件里也一样,你操作软件的过程都是输入,软件反馈的结果都是输出 
print("我爱中国")

# 换行打印,\n 后的内容会在下一行打印
print(“我爱\n中国")

# 为了输出信息更完整,经常在print()语句中使用,来拼接多个值
slogan="我是纯爱战神
print(slogan)
print("我的s1ogan是:",slogan)print("我的s1ogan是:",1)

常见的获取键盘输入
可以使用 input()函数等待并获取用户键盘上的输入,用户以回车结束输入,输入内容被认为是字符串

print(1)
input()
print(2)
password =input()
print(password)
# 推荐格式 变量名 = input"提示信息:")
password =input("请输入密码:")
print(password)

关于函数:
函数可以是别人或自己写的,可以直接使用,不用关心内部实现,目前学过的函数有:print()type()input()

 类型转换函数

first_number = input("请输入第一个数字:")
second_number = input("请输入第二个数字:")
result =first_number +second_number
print("计算结果是:",result)
# 计算结果出错,因为数据类型是字符串,相加的效果是拼接的计算,不是数值上的相加
# 改为
result=int(first_number)+int(second_number)

常用的几个类型转换函数

  • int(x)表示将 x转换为一个整数
  • float(x) 表示将 x转换为一个浮点数
  • str(x)表示将x转换为一个字符串
  • bool(x)表示将 x转换为一个布尔类型 

1.5 运算符

按优先级从最高到最低:

 1.6 判断语句

if-elif-else判断语句结构 

if 条件1:

        事情1

elif 条件2:

        事情2

elif 条件3:

        事情3
else:
        事情4

说明:

  • 如果满足条件1,执行事情1,代码块执行结束
  • 否则,如果满足条件2,执行事情2,代码块执行结束
  • 否则,如果满足条件3,执行事情3,代码块执行结束
  • 否则,执行事情4,代码块执行结束

代码示例:

score =77
if 90 <= score <= 100:
    print("本次考试成绩为A")
elif 80 <= score < 90:
    print("本次考试成绩为B")
elif 70 <= score < 80:
    print("本次考试成绩为C")
elif 60 <= score < 70:
    print("本次考试成绩为D")
else:
    print("本此考试成绩不及格"
#也可以写成 if score >= 90 and score <= 100:

if嵌套判断:

a=“帅”
b="善"
c="没有腹肌"
if a =="帅":
    if b ==“善”:
        if c =="有腹肌":
            print("处对象")

match-case判断

match x:
case 1:
    print('x is 1")
case 2:
    print(“x is 2")
case 3:
    print("x is 3")

1.7 循环

Python三大控制结构:顺序、分支、循环,用于控制代码执行顺序

  •  顺序: 从上而下,顺序执行代码
  • 分支: 根据条件判断,确定执行哪个分支的代码
  • 循环: 让特定代码块中的代码重复执行

1.7.1 while循环 

基本语法

当 条件(满足时):

        要做的事
while True:
        print("He1lo world")
# 上面缺少了条件限制,导致了死循环

i=0
while i < 5:
        print("He11o world")
        i=i+1 

计算1-100的和

i= 1
sum=0
while i <= 100:
    sum=sum +i
    i=i+1
print(sum)

计算1-100的偶数和 

i = 1
sum=0
while i <= 100:
    if i%2 == 0:
        sum= sum + i
    i = i+1
print(sum)

while嵌套

whi1e(天)条件:
    事
    while(题)条件:
        事
day = 1
while day <= 7:
    print("今天是第", day,"天")
    problem=1
    while problem <= 3:
        print("做了",problem,“道题”)
        problem += 1
    day += 1

1.7.2 for循环 

python 中的 for 循环, 可以遍历任何可迭代对象, 如: 字符串,列表,元组,字典

遍历可迭代对象:指按顺序,逐一得到全部数据,且无遗漏

for x in "abcdefg":
    print(x)
# 如果固定需要循环100次怎么办
for i in range(100):
    print(i)
# 效果等同于
i=0
while i < 100:
    print(i)
    i+= 1

a=range(5)        

# range()函数返回的是一个可迭代对象(类型是对象),打印时不能直观看到数据
b=list(a)        

# list函数可以把可迭代对象转为一个列表
print(b)

1.7.3 break和continue

break
作用: 立即终止当前循环,并跳出循环体外,并继续执行循环之后的代码

i = 1
while i<=5:
    print(i)
    if i == 3:
        break
i += 1
print(i)

for x in "abcdefg":
    if x == "e"
        break
    print(x)
print(x)

continue
作用: 跳过本次循环中的剩余代码,直接进入下一次循环

会导致死循环#
i = 1
while i <= 5:
    print(i)
        if i == 3:
            continue
    i += 1
# 死循环的修改思路i= 1
while i <= 5:
    i += 1
        if i == 3:
            continue
    print(i)

for x in "abcdefg":
    if x == "e"
        continue
    print(x)

注意点
break 和 continue 只能用在循环中,除此以外不能单独使用

break 和 continue 在嵌套循环中,只对最近的一层循环起作用 

二、Python高级数据类型 

2.1 字符串 

什么是字符串:双引号或者单引号中的数据就是字符串 

"123456""3.14""{[()]}'"!@#$%^'
震惊
print(type(a))

字符串格式化

字符串格式化就是把变量嵌入到字符串中,推荐使用字符串.format()

#电子生日贺卡中的祝福语,"He110 xx,祝你 xx岁生日快乐!"
name ="张三
age =18
print("He11o",name,",祝你",age,"岁生日快乐!")
print(“He11o {},祝你{}岁生日快乐!".format(name,age))

# 自定义名片
name = input("请输入你的名字:")#张三
position =input("请输入你的职位:")#软件测试工程师
company_name -input("请输入你的公司名:")#法外狂徒股份有限公司
print(“_”* 30)
print("姓名:{}".format(name))
print("职位:{}".format(position))
print("公司名称:{}".format(company_name))
print(“_” * 30)

字符串的下标
含义:下标其实就是编号,比如高铁上的座位号,超市储物柜的编号,用 字符串[下标]表示,如“abc"[1]

s="abcdef"
#下标从左往右,从0开始
print(s[0])
print(s[3])
print(s[6])#
# 超出下标范围会标错
#还有一套下标是从右往左,从-1开始
print(s[-1])
print(s[-2])
print(s[-6])

 切片

  • 含义:切片指截取其中一部分,字符串/元组/列表都支持切片
  • 语法: [起始下标:结束下标:步长],从起始位开始,到结束位为止(不包含结束位本身),步长表示切片间隔 
a="abcdefgh"
print(a[:])        #取所有,默认步长为1
print(a[::2])      #取所有,步长为2
print(a[:3])       #取前3位
print(a[5:])       #取第5位以后的内容
print(a[1:5])      #取第2,3,4,5位
print(a[1:5:2])    #取第2位和第4位
print(a[1:-1])     #取第2位到倒数第2位
print(a[5:1:-2])   #反向(从右向左),取第6位和第4位
print(a[::-1])     #:反转字符串

字符串常见操作 

 len(),获取字符串长度

s="听君一席话,如听一席话"
print(len(s))

find() 和 index(),检测字符串中是否包含某个子串,如果包含,则返回第一个找到的子串的初始下标

s="听君一席话,如听一席话!"
print(s.find(","))
print(s.index(","))
# 区别在于,如果找不到,find 返回-1,index则抛出异常
print(s.find("二"))
print(s.index("二"))
#[了解]s.find(sub,start,end)中
#start 表示搜索的起始位置,默认为0[可选]
#end 表示搜索的结束位置,默认为字符串的长度[可选]
# index()也支持这种写法
print(s.find("一席话”,0,11))
print(s.find("一席话”,6,11))

replace(),替换字符串中的某些子串,可以控制替换次数 

s="听君一席话,如听一席话"
print(s.replace("一","二"))
print(s.replace("一","二",1))

count(),返回字符串中某个子串出现的次数

s="听君一席话,如听一席话"
print(s.count("一席话"))
print(s.count("一席话",6,11))

split(), 以某字符为分隔符进行切片,如果 maxsplit 有指定值,则仅分割 maxsplit 次

s="听君一席话,如听一席话"
print(s.split("一"))
print(s.split("一",1))

startwith()和 endwith(),检査字符串是否以某子串为开始或结束,是则返回 True,否则返回 False

s="听君一席话,如听一席话"
print(s.startswith("听君"))
print(s.endswith("话"))

lower()和 upper(),把字符串中的所有字符转换为 小写 或 大写 字符

s="Hello world"
print(s.lower())
print(s.upper())

join() 格式为 分隔符.join(数据),数据可以是字符串,列表, 元组,字典,返回值是字符串

s="听君一席话,如听一席话!"
print("~".join(s))
l =[“广东省",“广州市","天河区..."]
print("".join(l)) 

[了解]除了上述常见操作外,字符串单词首字母大写,字符串的对齐,判断字符串是否只包含空格等各种操作 

2.2 列表

什么是列表
列表(List)是 python 中使用非常频繁的数据类型,在其他语言中通常叫做 数组.语法上用[]来定义一个列表,数据之间用,分割,例如:

name_list =["张三”,"李四",“王五”]

列表的索引从0开始(索引就是下标),引用超出索引就会抛出异常 

name_list =〔"张三","李四","王五"]
print(name_list[0])
print(name_list[1])
print(name_list[2])
print(name_list[3])

列表可以储存不同类型的数据

name_list=["张三",100,[1,2]]
print(name_list[0])
print(name_list[1])
print(name_list[2])
print(name_list[3]) 

 

列表的遍历

name_1ist =["张三","李四","王五"]
for name in name_list:
    print(name)

i=0
while i < len(name_1ist):
    print(name_list[i])
    i += 1 

列表增删改查操作 

  • append:list.append()        把数据加到列表末尾
  • extend:list.extend()          把一个可迭代对象逐一添加到列表中
  • insert:list.insert(列表元素,"要添加的元素")        在指定位置前插入数据
  • pop:list.pop(索引)        根据索引删数据
  • remove:list.remove(值)        根据列表中元素值删数据
  • list[索引]=值        改列表数据
  • in 和 not in 用于判断列表中是否存在某数据,成功为True,失败为False
  • index和count,与字符串中的用法相同

排序:sort方法是将列表按顺序正序排列,默认从小到大,参数reverse=True可改为倒序

注意: 需要排序的列表中的数据需要是同一类型的,同时存在整数和字符串就不能排序

列表生成式 

# 列表生成式顾名思义,可以帮我们生成列表
# 生成0~9的10个数
a=[x for x in range(10)]
print(a)
# 生成1~10
b=[x for x in range(l, 11)]
print(b)
# 生成10以内的奇数/偶数
c=[x for x in range(1,11) if x%2==0]
d=[x for x in range(1,11) if x%2==1]
print(c)
print(d)
# 生成10以内的各数的平方
e=[x**2 for x in range(l,11)]
print(e)

2.3 元组

什么是元组
元组 (Tuple)是与列表类似,语法上用()来定义一个元组

l=[1,2,3]
t=(1,2,3)
print(type(l))
print(type(t))

元组常见操作 

  • 元组中的数据不能修改
  • 对元组内的数据的操作只支持查询类操作,如:index,count 

2.4 集合

 什么是集合

  • 集合(Set),和列表,元组都很像,区别就是集合用于保存不重复的数据
  • 语法上,使用 {} 或者 set()进行创建
  • 集合也是可变的数据类型,可以有增删改查等各种操作
# 使用{}创建集合
collection={1,2,3,4}
print(type(collection))
# [推荐]使用set()函数创建集合,集合最主要的作用就是去重
l=[1,2,3,3]
t=(1,2,3,3)
c1=set(l)
c2=set(t)
print(c1,type(c1))
print(c1,type(c2))

2.5 字典 

 什么是字典
字典 (Dict),语法上用 {}来定义一个字典,数据之间用,分割,每个数据都是键值对的形式,包含键名(key)和键值(value)两个部分,例如:

d = {}
print(type(d))
t_info ={"name":"杰哥","sex":"男","age":18,"address":"广州","hobby":["吹牛","看电影"]}

字典中找某个数据不是根据下标来找的,是根据key, 如:
 

t_info ={"name":"杰哥”,"sex":"男","age":18,"address":"广州","hobby":["吹牛","看电影”]}
print(t_info["name"])
print(t_info["hobby"])

字典的常见操作
增,使用 变量名[“键“〕 = 值 时,如果”键"在字典中不存在,就会新增这个数据

t_info = {"name":"杰哥","sex":"男","age":18,"address":"广州","hobby":["吹牛","看电影"]}
t_info["score"]= 10
print(t_info)

删,pop和 clear 方法

t_info ={"name":"杰哥","sex":"男","age":18,"address":"广州","hobby":["吹牛","看电影"]}
t_info.pop("age")
print(t_info)
t_info.clear()
print(t_info) 

 

改, 和新增一样, 使用 变量名[“键"〕= 值 时, 如果"键"在字典中存在,就好更新这个值

查:

t_info ={"name":"杰哥","sex":"男","age":18,"address":"广州","hobby":["吹牛","看电影"]}
# 查询某个键对应的值
# print(t_info["a"])
# 键不存在时会报错
print(t_info.get("a"))
# 键不存在时会返回 None

# 查询字典的长度
print(len(t_info))

# 查询字典中的键列表,值列表,键值对元组的列表(以前返回列表,新版本python不再返回列表类型,但可以当做列表来使用)
print(t_info.keys())
print(t_info,values())
print(t_info.items())

# 遍历
for key in t_info.keys():
    print(key)
for value in t_info.values():
    print(value)
for item in t_info.items:
    print(item)
for key,value in t_info.items():
    print(key,value)

python中有哪些数据类型,其中可变和不可变得数据类型都有什么?
常见的数据类型有整型int,浮点型float,布尔bool, 字符串string,列表list,元组tuple,集合set,字典dictionary

  • 其中可变数据类型有: 列表,集合,字典
  • 不可变数据类型有: 数字,布尔,字符串,元组 

三、Python的函数 

3.1 函数介绍

函数定义:可以被重复使用的代码块

使用步骤:定义函数,封装独立功能,调用函数

查看函数使用文档:print(help(函数)) 

3.2 函数的参数 

def add_2num():
    x=1
    y= 2
    print(x+y)
add_2num()
# 这个函数只能把固定的两个数相加,怎么样让这个函数适用于可变的两个数相加,答案就是参数
def add(x,y):
    print(x+y)
add(2,3)

参数的基本含义:

  • 形参: 在定义时使用的,用于在调用时接收变量值的形式参数 (如上述代码中的x和 y)
  • 实参: 在调用时传入的实际参数值(如上述代码中的 2和 3)

注意

# 注意,调用参数时,参数的位置和数量是一致的
# add(1,2,3)    # 参数数量不一致会报错
add(y=1,x=2)     # 如果位置需要变动,则需要以 变量名=参数值 的形式传参
# 参数的默认值 (缺省值),需保证带有默认值的参数在未尾,def add(x=1,y): 是错误的
def add(x,y=1):
    print(x+y)
    add(1)
add(2,2)

参数拓展

# def len(*args,**kwargs):在这个定义中 *args 和 ** kwargs 是什么?
# 这些用于传参数量不确定的情况
# *args 用于接收不确定个数的参数,"它会将传入的参数打包成一个元组
def demo(*args):
    print(args)
demo(1,2,3)
demo((4,5,6))
demo()
# **kwargs 用于接收不确定个数的关键字参数(键=值),并打包成一个字典
def demo(**kwargs):
    print(kwargs)
demo(a=1,b=2,c=3)

 

说明
args 和 kwargs 是可以改变名字的,但不推荐, args 是arguments (参数的缩写), kw 是keyword (关键字)的缩写
参数定义是有顺序的: 必选参数,默认参数,可变参数,如:

def demo(a,b,c=1,*args,**kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)
demo(1,2,3,4,5,6,aa=7,bb=8,cc=9)

3.3 函数的返回值 

什么是返回值
在程序开发中,有时候会希望一个函数执行结束后,告诉调用者一个结果,这个结果就是返回值

  • 语法上,使用 return 这个关键字来返回结果 
def add(x,y):
    print(x+ y)
    a= add(1,2)
print(a)    # 结果是 None,说明add函数只关注打印和的过程,没有返回值
def add(x,y):
    return x+y
a= add(1,2)
print(a)print(add(a,3))

#函数执行到了 return 就会结束
demo():
    print(1)
    print(2)
    return 0
    print(3)
    print(4)
demo()

3.4 函数的执行过程

# 函数中三大结构和嵌套调用时的执行过程
def demo1():
    print(1)
    print(2)
    print(3)
def demo2():
    print(1)
    if True:
        print(2)
    print(3)
def demo3():
    print(1)
    for i in range(3)
    print(2)
    print(3)
def demo4_a():
    print("a_start")
    print("a_stop")
def demo4_b():
    print("b_start")
    demo4_a()
    print("b_stop")

demo1()
demo2()
demo3()
demo4_b()
demo4_a()

3.5 局部变量和全局变量

局部变量和全局变量

  • 从含义上说,局部变量定义在函数内部,全局变量定义在函数外部

从作用域的角度说

  • 局部变量只能在函数内部使用,函数执行结束后,变量会被回收,不同函数可以有同名的局部变量。
  • 全局变量可以在全局使用 (不论函数内外),但如果全局变量太多可能导致不好维护

局部变量是在函数内部定义的变量,只能在函数内部使用

注意:

  • 局部变量和全局变量是个相对的概念,示例中的局部是函数内部,全局是文件全局
  • 未来大家可能会接触到作用域更大的变量,比如整个项目都可以使用的,这种也是全局变量

如何在函数内部修改全局变量 

# 在函数内部定义与全局变量同名的变量时,两个变量是不同的,并不能直接修改全局变量
a =1
    def demo():
    a =2
demo()
print(a)

# 可以使用 globa] 关键字引用全局变量
b=1
def demo():
    global b
    b=2
demo()
print(b)

 3.6 匿名函数lambda

# 匿名函数的定义语法是 Tambda 参数:表达式
# 匿名函数中不能使用 print,表达式就是返回值(无需写return)
# lambda x,y:x+y    #这样就定义了一个两个数相加的匿名函数

# 应用1
sum=lambda x,y:x+y
print(sum(1,2))

#应用2,在高阶函数中,作为参数传递
def sq(x):
    return x**2
print(list(map(sq,[xfor xin range(10)])))
print(list(map(lambda x:x**2,[xfor xin range(10)])))

四、面向对象编程(OOP) 

4.1 基本理解

面向对象和面向过程编程思想

两种思想的区别

  • 面向过程: 强调的是步骤,过程,每一步都是自己亲自去实现 用怎么做的思想来解决问题
  • 面向对象:找个对象,让对象来实现(专业的人干专业的事儿),用谁来做的思想来解决问题
  • 面向对象是基于面向过程的

面向对象编程的优点

  • 面向过程: 根据业务逻辑从上到下写代码(之前的函数式编程, 都是面向过程的)
  • 面向对象: 减少了重复代码,高度封装,易扩展

4.2 类和对象

类是抽象的,对象是一个具体的事物

# 定义一个Dog类
class Dog:
    pass
# 定义一个对象dahuang
dahuang = Dog()
xiaobai = Dog()
# isclass函数 用于判断是不是一个类,True表示是类 False表示不是类
# print(inspect.isclass(Dog))
# print(inspect.isclass(dahuang))
#ctr1 + D 快速辅助并粘贴到下一行

# type函数,表示查看一个数据的类型# print(type(1))
# print(type(dahuang))

# isinstance函数来判断参数1是否是参数2的一个实例(对象)
# print(isinstance(l,int)
# print(isinstance(dahuang, Dog))

# id函数,可以查看变量的内存地址
print(id(dahuang))
print(id(xiaobai))

 4.2.1 类的构成

类 是对一群具有相同的特征或者行为的事物的统称

  • 特征 被称为 属性
  • 行为 被称为 方法

如何体现对象和对象之间的区别?
通过属性和方法来体现同一个类的不同对象的区别

类由3个部分构成

  • 类的名称: 类名
  • 类的属性: 拥有的特征 (名词)
  • 类的方法: 拥有的能力(动词)

示例
"人"类 

  • 类名:Person
  • 属性: 国籍, 性别,年龄,身高, 体重...
  • 方法: 学习,跑,打游戏... 

注意
在程序开发过程中,只关注需求中涉及的属性和方法
        如一个人的身份证上不会记录身高,体重等属性,也不需要知道这个人游戏打得好不好 

4.2.2 类的设计

开发人员如何分析需求,确认程序中需要包含哪些类?

用名词提炼法分析业务,出现的名词,通常就是找到的类 

4.3 基础语法 

4.3.1 定义类和对象

# 创建类
class Hero():
# 定义属性
    hp =1000
# 定义函数
    def info(se1f):
        print("我是一个英雄")
# 或者
class Hero:
    hp =1000
        def info(self):
            print("我是一个英雄")

# 创建对象
anqila = Hero()

说明

  • 类名的命名规则按照"大驼峰命名法",每个单词的首字母大写,单词和单词之间没有下划线
  • info 是一个实例方法,第一个参数一般是self, 表示实例对象本身,当然了可以将self换为其他名字,其作用是一个变量,这个变量指向了实例对象

4.3.2 类中的方法

4.3.2.1 魔术方法

有些特殊方法,在python代码执行时可以自动调用,这些方法被称为魔术方法

  • 魔术方法名的两侧各有2个下划线
  • 常用的魔术方法有__init__,__str__,__del__等
  • 软件测试人员最常用的是__init__方法,用来完成属性的初始化,它在创建对象时默认执行 
class Hero:
    def _init_(self):
        self.name = None
        self.sex= None
        self.hp=0
        self.attack=0
    def info(self):
        print("我是一个英雄")


anqila=Hero()
chengyaojin=Hero()
print(anqila.name)
print(anqila.sex)
print(anqila.hp)
print(angila.attack)
print(chengyaojin.name)
print(chengyaojin.sex)
print(chengyaojin.hp)
print(chengyaojin.attack)

每个对象好像有自己的属性,又没有 

class Hero:
    position ="泉水"
    def __init__(self,name,sex,hp, attack):
        self.name =name
        self.sex=sex
        self.hp =hp
        self.attack =attack
    def info(self):
        print("我叫{},性别{,血量为{},攻击力为{}".format(self.name,self.sex,self.hp,self.attack))

anqila=Hero("安琪拉","女",1000,200)
chengyaojin = Hero("程咬金”,"男”,8000,666)
print(angila.position)
angila.info()
chengyaojin.info()

 类属性和实例属性

Class 类名:
    # 类属性,表示的是类的共性,如汽车类,共性的内容有,有轮子,有座椅,有方向盘,有挡风玻璃
    类属性名1 = 值1
    类属性名2 = 值2

    # 实例属性,表示的是对象(实例)的个性,轮子数量,轮毂样式,座椅数量,是不是敞篷
def __init__(se1f,参数1,参数2):
    self.实例属性名1= 参数1
    se1f.实例属性名2 = 参数2
4.3.2.2 实例属性 

特点:

  • 实例方法是每个对象独有的
  • 实例方法需要带 se1f 参数
  • 主要用于处理实例属性,也可以访问其他实例方法 
def 实例方法(self,参数):
    pass

调用:类.实例方法(参数) 

4.3.2.3 类方法 

特点

  • 类方法是针对类定义对的方法
  • 类方法需带 c1s 参数
  • 主要用于处理类属性,也可以访问其他类方法

语法:

@classmethod
def 类方法名(c1s):
    pass

类方法需要用装饰器 @classmethod 来标识, 告诉python解释器这是一个类方法

调用
类名.类方法名()
 

class Hero:
    born_position ="泉水"
    def __init__(self,name,sex, hp, attack):
        self.name = name
        self.sex=sex
        self.hp= hp
        self.attack =attack
    def info(self):
        print("我叫{},性别{},血量为{},攻击力为{}".format(self.name,self.sex,    self.hp,self.attack))

    @classmethod
    def where_was_i born(cls):
        print("我在{}出生".format(cls.born_position))
# angila = Hero("安琪拉","女",1000,200)
# chengyaojin = Hero("程咬金","男",8000,666)
    
    @staticmethod
    def haha():
        print("哈哈哈")

Hero.where_was_i born()
Hero.haha()
 4.3.2.4 静态方法

特点
如果想在类中封装一个方法,既不需要访问实例属性和类属性,也不需要访问实例方法和类方法这个时候,就可以把这个方法封装成一个静态方法
语法

@staticmethod
def 静态方法名():
    pass


静态方法需要用装饰器 @staticmethod 来标识,告诉python解释器这是一个静态方法
调用
类名.静态方法名()

小结

  • 实例方法,方法内部需访问 se1f.属性名 的实例属性, 也可以访问 类名.属性 的类属性
  • 类方法,方法内部只需要访问类属性
  • 静态方法,方法内部不需要访问任何属性

 

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

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

相关文章

vue循环渲染动态展示内容案例(“更多”按钮功能)

当我们在网页浏览时&#xff0c;常常会有以下情况&#xff1a;要展示的内容太多&#xff0c;但展示空间有限&#xff0c;比如我们要在页面的一部分空间中展示较多的内容放不下&#xff0c;通常会有两种解决方式&#xff1a;分页&#xff0c;“更多”按钮。 今天我们的案例用于…

mybatis 配置文件完成增删改查(二):根据条件查询一个

文章目录 参数占位符#{}:会将其替换为&#xff1f; ——为了防止sql注入${}:会将其替换为实际接收到的数据&#xff0c;拼sql ——无法防止sql注入 查询一个sql特殊字符的处理 参数占位符 #{}:会将其替换为&#xff1f; ——为了防止sql注入 ${}:会将其替换为实际接收到的数据…

Java继承教程!(o|o)

Java 继承 Java面向对象设计 - Java继承 子类可以从超类继承。超类也称为基类或父类。子类也称为派生类或子类。 从另一个类继承一个类非常简单。我们在子类的类声明中使用关键字extends&#xff0c;后跟超类名称。 Java不支持多重继承的实现。 Java中的类不能有多个超类。…

Linux-gcc/g++

系列文章目录 C语言中的编译和链接 文章目录 系列文章目录一、编译过程gcc如何完成过程在这里涉及到一个重要的概念:函数库 二、动态库、静态库2.1 函数库一般分为静态库和动态库两种。 三、gcc选项gcc选项记忆 一、编译过程 具体过程在这一片c语言文章中讲解过:C语言中的编…

shardingjdbc分库分表原理

一 Mysql的瓶颈 二 解决方案 三 hash环算法 四 雪花算法

CCF csp认证 小白必看

c支持到C17(还是更高?)&#xff1b;所以学一些封装好的函数功能是必要的---比如STL里的函数&#xff1b; 因为可携带纸质资料&#xff0c;建议打印带入&#xff0c;需要时可翻阅。 【题目概述:】 0-devc环境配置 配置好你常用的编译版本&#xff1a; 想要调试记得开启下选…

分布式系统的CAP原理

CAP 理论的起源 CAP 理论起源于 2000 年&#xff0c;由加州大学伯克利分校的 Eric Brewer 教授在分布式计算原理研讨会&#xff08;PODC&#xff09;上提出&#xff0c;因此 CAP 定理又被称作布鲁尔定理&#xff08;Brewer’s Theorem&#xff09;。2002 年&#xff0c;麻省理…

「OC」引用计数(一)

iOS学习 前言自动引用计数引用计数引用计数的思考方式自己生成的对象&#xff0c;自己持有非自己生成的对象&#xff0c;自己也能持有不再需要自己持有的对象时释放无法释放非自己持有的对象 总结 前言 在学习oc时对引用计数略有了解&#xff0c;现在进行系统的学习总结。 自动…

力扣 无重复字符的最长子串

无重复字符的最长子串 https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/ 题目描述 题目分析 寻找无重复字符子串&#xff0c;首先要求是子串&#xff0c;然后是无重复 子串可以用滑动窗口确定 问题在于如何确定无重复 如果用暴力枚…

Java笔试面试题AI答之设计模式(5)

文章目录 21. 简述Java什么是适配器模式 ?适配器模式的主要组成部分包括&#xff1a;适配器模式的实现方式主要有两种&#xff1a;适配器模式的优点&#xff1a;适配器模式的缺点&#xff1a;示例说明&#xff1a; 22. 请用Java代码实现适配器模式的案例 &#xff1f; 21. 简述…

01 基础request

目录 类 WxRequest 的定义 静态属性 default 构造函数 constructor 方法 request HTTP 方法封装 创建 WxRequest 实例并导出 完整代码&#xff1a; 类 WxRequest 的定义 创建一个 WxRequest 类包含一个静态属性 default 和几个方法&#xff0c;用于处理网络请求。 静态…

Kotlin编程全攻略:从基础到实战项目的系统学习资料

Kotlin作为一种现代、简洁的编程语言&#xff0c;正逐渐成为Android开发的新宠。本文将为您介绍一套全面的Kotlin学习资料&#xff0c;包括学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;帮助您从Kotlin的基础语法到实战项目开发&#xff0c;系统地提升您的编程技能。…

jetlinks物联网平台学习2(加盐算法登陆)

加盐算法 加盐算法加密验证密码是否正确 对于传统的MD5加密&#xff0c;比更传统的直接保存账号密码稍微安全一点。 md5加密是一种hash算法 比如对于123456来说&#xff0c;md5算法结果一定是e10adc3949ba59abbe56e057f20f883e 这个结果是固定的。于是有的人准备一张彩虹表 预先…

vscode 配置django

创建运行环境 使用pip安装Django&#xff1a;pip install django。 创建一个新的Django项目&#xff1a;django-admin startproject myproject。 打开VSCode&#xff0c;并在项目文件夹中打开终端。 在VSCode中安装Python扩展&#xff08;如果尚未安装&#xff09;。 在项…

SpringCloud-07 GateWay01 网关技术

Spring Cloud Gateway组件的核心是一系列的过滤器&#xff0c;通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器&#xff0c;隐藏微服务结点IP端口信息&#xff0c;从而加强安全保护。Spring Clou…

基于SpringBoot+Vue的高校门禁管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…

长亭WAF绕过测试

本文的Bypass WAF 的核心思想在于&#xff0c;一些 WAF 产品处于降低误报考虑&#xff0c;对用户上传文件的内 容不做匹配&#xff0c;直接放行 0、环境 环境&#xff1a;两台服务器&#xff0c;一台配置宝塔面板&#xff0c;一台配置长亭雷池WAF 思路主要围绕&#xff1a;m…

Python | Leetcode Python题解之第423题从英文中重建数字

题目&#xff1a; 题解&#xff1a; class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

DAY78服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE 漏洞

知识点&#xff1a; 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE 前置知识 1、复现环境&#xff1a;Vulfocus(官方在线的无法使用&#xff0c;需要自己本地搭建) 官方手册&#xff1a;https://fofapr…

20240922 每日AI必读资讯

OpenAI 首席科学家 MIT演讲&#xff01; - 揭示 o1模型训练核心秘密&#xff1a; 通过激励模型学习是培养 AGI 系统通用技能的最佳方式。 - 提出了类比“教人钓鱼”的方式&#xff0c;强调激励学习的重要性&#xff1a;“授人以鱼&#xff0c;不如授人以渔”&#xff0c;但是…