Python基础8 类、作用域、异常捕获、排序

.......................类1..............................
#Python是面向对象的编程语言,面向对象的特点,继承,封装,多态
#面向对象编程:和面向过程一样,是一种编程思想
#类:具有相同属性和行为方法的事物的抽象的集合,类的例子:人类、猴

类、鱼类;人类的属性:身高、体重。。人类的行为:吃喝拉撒睡,
#对象:;类的具体的实例化
#人类中的对象:马云、马化腾、丁三石
#类的作用:创建对象  一般会在类中定义一些属性和函数,当时用类创建

对象的时候,该对象会拥有类中定义的这些属性和函数
#类中的一些属性和函数,是由所有的对象身上共同的属性和行为抽离出来

的
#对象的作用:实现函数和属性的调用执行的

#在Python中声明一个类:class:班级群体
#object 继承的父类  object基类、顶级父类

d1={'name':'张三','age':'22','phone':'110'}
d2={'name':'李四','age':'23','phone':'120'}
student_list=[d1,d2]
# print(student_list)

class People(object):
    #pass 保证语法完整性
    #pass
    #例如:人出生时,已经包含了性别,体重等属性
    #__init__(self)初始化函数 。类中内置函数,,在创建对象时自动

调用
    def __init__(self,name,age,phone):
        # print('.......')
        #在这个函数中需要将创建对象时就应该拥有的一些属性赋值
        #对象.属性名=属性值
        self.name=name
        self.age=age
        self.phone=phone
#使用people类创建一个对象,创建对象的基本格式:对象名=类名()
#当创建一个对象时,会在内存中开辟一块空间,来存放这个对象,这个对

象是由一个地址的,每次创建的对象都是一个单独的个体,他们的内存地址

都不一样
#p1不是对象,是一个指针,通过指针找到对象;People()是对象
p1=People('张三','22','110')
#输出结果:<__main__.People object at 0x000000000104C080>
#0x000000000104C080内存地址
#内存:程序运行时,在计算机中占用的空间
#Python中是自动管理内存的
#电脑上的500G这种是硬盘空间(存储空间)
#print(p1)
#p2=People()
#print(p2)
#获取一下对象的属性值:对象.属性名
name=p1.name
age=p1.age
phone=p1.phone
print(name,age,phone)

#修改对象的属性值:对象.属性名=属性值(此时该属性已经存在)
p1.name='李四'
print(p1.name)
#Python中用来设置对象属性值的函数
#三个参数:1.要设置属性值的对象2.要设置的属性名3.要设置的属性值
setattr(p1,'age','25')
print(p1.age)
#可以给对象添加新的属性:对象.属性名=属性值,,,如果这个属性不存在

,就是添加属性
p1.sex='男'
print(p1.sex)
#再给对象添加属性时,给那个添加,哪个有该属性,但是其他对象并没有

噶属性
# p2=People('王五',23,120)
# print(p2.sex)

#删除对象属性:del 对象.属性名
del p1.sex
#对象的属性被删除之后,就不能再用了
#当删除的属性不存在时会报错:AttributerError
#删除对象属性的函数
#两个参数:1.要删除的对象2.要删除的属性名
delattr(p1,'phone')
#删除之后,就不能再利用这个属性了
#print(p1.phone)
#setattr函数动态添加或者修改属性
attr_dict={'iq':'150','eq':'150','color':'yellow'}
#for循环遍历字典
for key,value in attr_dict.items():
    #key是属性名,value是属性值
    #p1.key=value这种方法无法添加,因为相当于:p1.'iq'='150'
    #需要利用setattr函数,可以将一个字符串的属性名添加到对象的属性

中
    setattr(p1,key,value)
print(p1.iq)

#动态删除对象的属性
attr_list=['iq','eq','color']
for attr in attr_dict:
    #可以使用delattr函数删除
    delattr(p1,attr)
#对象属性删除之后,不可再用
#print(p1.attr)

........................类2...................................
# -*- coding:utf-8 -*-
#类属性、类变量:只能由类调用的属性
class People(object):
    #类变量可以由所有的对象访问,但是对象只能访问不能修改,类变量

可以用来做资源共享
    #total,name1为类属性
    total=0
    #name1='python8'
    #初始化函数,添加对象属性
    def __init__(self,name,age,school):
        #给对象属性赋值
        self.name=name
        self.age=age
        self.school=school
        #只能使用类名去修改类变量的值
        People.total+=1

#创建对象
#p1和p2是两个不同的对象,这两个对象各自的信息是不可以共享的
p1=People('娄**',21,'郑州电力职业技术学院')
print(People.total)
p2=People('韩**',22,'河南理工大学')
print(p1.name)
print(People.total)
#类调用类属性
#print(People.name1)
#类无法访问对象实例属性,
#print(People.name)
#对象实例可以访问类属性或者类变量
# print(p1.total)
#对象没有办法修改类属性的值
#相当于给p1对象添加了一个total属性
p1.total=100
print(People.total)

#如果需要修改类变量 的值,只能由类调用修改
# People.total=10000
# print(People.total)
#若对象没有total属性,此时输入的是类对象修改之后的值
# print(p1.total)

p3=People('张三',23,'智游')
#。。。。。获取对象的属性值
#方法一:
name=p3.name
print(name)
#如果没有该属性,会报错
# name=p3.ssss
# print(name)
#方法二:
#使用getattr(object,name,default)函数
#三个参数含义:object:要获取属性的对象;name  要获取的属性名 ;

default 当属性不存在时,赋一个默认值
age=getattr(p3,'age',30)
print(age)
#当属性不存在时,使用该方法不会报错,会给一个默认值


#hasattr(object,name)判断某个对象是否拥有某个属性
#判断会返回结果,如果有这个属性返回Ture,没有返回False
s=hasattr(p3,'age')
print(s)

#先判断是否有这个属性,再执行获取属性值的操作
if hasattr(p3,'ssss'):
    s=p3.ssss
else:
    print('p3没有ssss这个属性')



........................类3...................................
# -*- coding:utf-8 -*-
#对象实例函数
class People(object):
    #关于初始化函数,如果需要在创建对象的时候,给对象属性赋值,就

可以在初始化函数中传递参数,给属性赋值;如果不需要初始化对象属性值

,就不用写初始化函数了
    def __init__(self):
        #初始化函数可以不用传递参数值,可以直接给属性赋一个默认值
        self.name='张三'
        self.age=20
    #凡是在类中定义的函数,如果定义函数前,没有添加装饰器,这个函

数默认为对象函数,只能由对象去调用执行 ,类也可以执行该函数,但是

在调用时必须将一个Peopele类的对象作为参数进行传递,也就是说,无论

是谁调用,都必须要有一个对象
    def eat(self):
        # self参数不需要手动传递,在运行Python程序时,解释器会自

动将调用函数的对象作为self参数进行传递
        #self指的是:对象A调用这个函数,self就是对象A;对象B调用这

个函数,self就是对象B
        #输出self
        print(self)

    def look_movie(self,name,price=29,*args,**kwargs):
        print(name,price,args,kwargs)

# #此时p1有默认值
p1=People()
print(p1.name)
#修改属性值
# p1.name='张三丰'
# print(p1.name)

p1=People()
#对象调用函数
p1.eat()
print('p1:  %s'%p1)
print('************')
p2=People()
p2.eat()
print('p2:  %s'%p2)
#如果使用类调用对象函数,必须将一个对象作为参数传入函数中
#把p1当做对象
People.eat(p1)

#p1调用多参数函数
p1.look_movie('前任3',39,1,50,drink='coco',
              eat='boomflower')



.................类4.私有属性.......................
# -*- coding:utf-8 -*-
#对象的私有属性
class People(object):
    """description可以写一些类的描述"""
    def __init__(self,name):
        self.name=name
        #声明一个对象的私有属性
        #私有属性只能在类声明的范围内使用,
        #声明私有属性,需要在属性名前加__双下划綫
        self.__age=18
        #一个下划线不是私有属性
        self._height=180


    #如果想要在类声明的外部获取私有属性的属性值,专门写一个函数,

在函数中将私有属性值返回,在类声明外部就可以调用这个函数获取私有属

性,获取__age的属性值
    def get_age(self):
        #print(self.__age)
        #返回__age的属性值
        return self.__age

    # 如果想要在类声明的外部获取私有属性的属性值,专门写一个函数,

在函数中对私有属性值赋值,在类声明外部就可以调用这个设置私有属性,

修改_age的属性值
    def set_age(self,value):
        #类声明的范围内,可以放私有属性
        self.__age=value

p1=People('张三')
print(p1.name)
#一个下划线不是私有属性,可以在外部访问
print(p1._height)
#超出声明的范围,所以这个位置是无法访问__age属性值的,在外部调用会

报错
#print(p1.__age)
#通过调用get_age函数,获取__age值
age=p1.get_age()
print(age)
#在类声明的外部,无法直接修改私有属性值
#p1.__age=20
#调用set_age函数
p1.set_age(20)
age=p1.get_age()
print(age)
*****************变量作用域****************************
#作用域:(变量能使用的范围)一个变量产生作用的范围,在哪一个范围

内可以被使用
#作用域分为两种:全局变量作用域     局部变量作用域
#全局变量:一般在函数或者代码块外部声明的变量(声明时要顶格写),

作用域范围,从声明的位置开始往下,一直到文件末尾都可以使用

#局部变量:一般在函数内部或者代码块内部声明的变量,被称为局部变量

,这类变量只能在函数或者代码块内部使用,超出范围则不可使用
#全局变量
a=100
#局部
def eat():
    #这个变量c作用范围在函数内部
    c=10
    print(c)
rs=eat()
#print(rs)


#全局变量如何在函数内部进行赋值操作
name='张三'
#默认情况下,如果全局变量的名称和局部变量的名称相同,例如:都是

name,局部变量会将这个全局变量覆盖(即函数中是局部变量)
def change_name():
    #如果不使用globle引用全局变量,是可以获取这个全局变量的值
    s=name
    #但是不能修改全局变量值,一旦修改,相当于创建一个和全局变量重

名的局部变量


    #当想要在函数中改变全局变量  global:全局 ,引用一个全局变量,

避免出现一个和全局变量重名的局部变量
    # global告诉这个函数,在函数内部使用name变量是一个全局变量
    global name
    name='李四'
    # print(name)
change_name()
print(name)

*************************异常捕获*************************
# -*- coding:utf-8 -*-
#try ..... except......用于异常捕获,当一段代码程序执行时出现异常

(报错),会导致整个程序结束,出现异常的地方之后的逻辑代码就不会执

行了,所以需要捕获异常,当捕获到异常之后,可以对异常进行处理。处理

完成之后,可以保证项目中的其他代码不会受影响

try:
    print(name)
except Exception as e:
    print('............',e)
print('=====================')


list1=[1,2]
try:
    s=list1[4]
except Exception as e:
    #Exception所有错误类型的基类
    '''
    错误类型
    1.IndexError   索引错误
    1.NameError   名称错误
    1.ValueError   值错误
    1.KeyError   键错误
    5.ImportError   引用错误
    '''
    print('索引越界')
    #如果出现异常,可以在这个代码块写处理异常的方案
    #   取出最后一个
    s=list1.pop()
    print(s)
print('****************')

#捕获指定类型的异常,只能捕获指定的类型,此时若有其他类型错误,则仍

会报错
try:
    import ssss
    print(name)
except (ImportError,NameError) as e:
    #可以指定只捕获的一类,也可以捕获多种,用括号括起来
    print(e)


#try....except.......else...
# 如果代码块出现异常执行except后的代码块,没有出现异常,执行else里

后的代码块
try:
    print('123456')
except Exception as e:
    print(e)
else:
    #没有出现异常会执行else中的代码块
    print('try中的代码没有出现异常错误')


#自定义触发异常
#使用场景:如果需要达到某种条件才能执行,否则抛出异常,可以使用

raise触发自定义的异常
def test(age):
    if age<16:
        #raise触发异常,自己设置的异常 :Exception(异常)
        raise Exception('小于16岁,禁止使用童工!')
    else:
        print('录用!')
# test(15)

#捕获自定义异常
try:
    test(15)
except Exception as e:
    print('...........%s'%e)
    test(16)

#try.....except.....else.....finally,,,
#finally后的代码块,无论是否异常,都会执行这个代码块
#例如:读写数据,无论读写是否成功,都需要把关闭文件,这个关闭文件

的操作就可以放在finally代码块中
try:
    #检测的代码
    print(name)
except Exception as e:
    #捕获到异常执行的代码
    print(e)
else:
    #没有异常执行的代码
    print('没有出现异常')
finally:
    #无论是否出现异常,都会执行的代码
    print('**********')

**************************排序**********************
# -*- coding:utf-8 -*-
#..................注意:该课件在2.7版本中运行.............
#..................注意:该课件在2.7版本中运行.............
#..................注意:该课件在2.7版本中运行.............
#sorted()函数 可以对数字(从小到大或者从大到小)或者字符串(按照

ASCII编码)进行排序
#对数字进行排序,默认按照升序排序
#列表还可以利用sort()函数队列表进行排序
list1=[4,85,75,12,0,54,32,15]
#方法一:该方法不能用一个变量接收,否则会输出none
list1.sort()
print(list1)
#方法二:
rs=sorted(list1)
print(rs)


list1=[4,85,75,12,0,54,32,15]
#实现一个按照降序排序的函数
#如果x>y,返回-1,x<y 返回1,是按照降序排序,
#如果x>y,返回1,x<y返回-1,按照升序排列
def reversed(x,y):
    if x>y:
        return -1
    if x<y:
        return 1
    return 0
rs=sorted(list1,reversed)
print(rs)


list2=['f','t','r','u','r','p','w']
rs=sorted(list2)
print(rs)

#如果需要实现字符串的排序,忽略大小写,只按照小写的a-z进行排序
list3=['if','With','BOY','Adc','case','session']
def char_sort(string1,string2):
    #把两个字符串全部转换为小写或者大写
    s1=string1.lower()
    s2=string2.lower()
    if s1>s2:
        return -1
    if s1<s2:
        return 1
    return 0
rs=sorted(list3,char_sort)
print(rs)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值