python语法 进阶篇

进阶篇

面向对象
对象就是"容器",用来存放数据和功能的,数据和功能的集合体。
类也是"容器",是用来存放同类对象共用的数据和功能的

面向过程:把程序流程化
注意面向对象是一种编程思想

1.类

解决不同对象存放相同数据的问题

class Hero:
    hero_work='射手'
    def __init__(self,name,hp,speed,atk):
        self.name=name
        self.hp=hp
        self.speed=speed
        self.atk=atk
        self.equipment=[]

    def get_hero_info(self):
        print(f'英雄属性:\n名字:{self.name},移速:{self.speed},生命:{self.hp},攻击力:{self.atk}')

    def set_hero_speed(self,speed_plus):
        self.speed+=speed_plus

    def buy_equipment(self,e_name):
        self.equipment.append(e_name)

类的属性访问

print(Hero.__dict__['get_hero_info'])

得到函数的内存地址
image

对象的产生

传入的属性分别对应前面定义__init__方法的参数:名字,生命值,速度和攻击力

hero1_obj=Hero('鲁班七号',3000,400,100)

hero2_obj=Hero('后羿',3100,410,110)

调用类的过程
1.创建空对象
2.调用__init__方法,以及调用类的时候括号里的参数,一同传递给__init__对象
3.返回初始化之后的对象

2.隐藏属性

面向对象三大特性:封装、继承、多态
封装:整合
隐藏属性
1.本质:隐藏的本质,只是一种改名操作
2.对外不对内

3.property

作用:用来绑定给对象的方法伪装成一个数据类型

class Test:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age
    def f1(self):
        print(self.__age,self.__name)
    def get_age(self):
        return self.__age

    def set_age(self,new_age):
        if type(new_age) is not int:
            print("你个傻子,年龄只能为整数")
            return

        if not 0<=new_age <=150:
            print("你个傻子,年龄必须在0-150岁之间")
            return
        self.__age=new_age
    def del_age(self):
        del self.__age

    age = property(get_age,set_age,del_age)

obj1=Test('xxx',118)

print(obj1.age)

obj1.age=200
print(obj1.age)

4.继承

  • 特性:遗传

  • 多继承的优缺点:

    • 优点:

      • 一个子类可以同时遗传多个父类的属性
    • 缺点

      • 1.多继承违背了人的思维习惯
      • 2.多继承使代码可读性变差

如果必须使用多继承,应该使用Mixins(一种编程规范)

class Parent1:
    x=10
    pass

class Parent2:
    pass

class Child1(Parent1):#单继承
    pass

class Child2(Parent1,Parent2):#多继承
    pass
print(Child1.__bases__)
print(Child2.__bases__)
print(Child1.x)

image


class Human:
    star = 'earth'
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender


class Chinese(Human):
    nation='China'
    def __init__(self,name,age,gender,balance):
        Human.__init__(self,name,age,gender)
        self.balance=balance


    def speak_chinese(self):
        print(f'{self.name}在说普通话')

class American(Human):
    nation='美国'

    def speak_English(self):
        print(f'{self.name}在说英语')

h1=Chinese('张征',55,'男',66)
h1.speak_chinese()

image

5.MixIns机制

class Fowl:
    pass

class SwimMixIn:
    def swimming(self):
        pass

class Chicken(Fowl):
    pass

class Duck(SwimMixIn,Fowl):
    pass

class Goose(SwimMixIn,Fowl):
    pass

引入MixIn有助于提高代码可读性,通过后缀加入MixIn,able,ible

6.super

class Human:
    star = 'earth'
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender


class Chinese(Human):
    nation='China'
    def __init__(self,name,age,gender,balance):
        super(Chinese,self).__init__(name,age,gender)
        self.balance=balance


    def speak_chinese(self):
        print(f'{self.name}在说普通话')

class American(Human):
    nation='美国'

    def speak_English(self):
        print(f'{self.name}在说英语')

h1=Chinese('张征',55,'男',66)
h1.speak_chinese()

print(h1.__dict__)

image

7.多态

多态是一种编程思想

# coding:utf-8
class Car:
    def run(self):
        print("开始跑")

class Benz(Car):
    def run(self):
        super().run()
        print("加98号汽油")

class Car1(Car):
    def run(self):
        super().run()
        print("这是car1")

class Car2(Car):
    def run(self):
        super().run()
        print("这是车2")


c1=Benz()
c2=Car1()
c3=Car2()
c1.run()
c2.run()
c3.run()

image

8.静态方法(staticmethod)

类里面的一个函数用不到类的参数等等,可以用静态函数

class Mysql:
    def __init__(setting,ip,port):
        setting.IP=ip
        setting.PORT=port
    @staticmethod
    def f1(cls):
        print('666')
        
    @classmethod
    def instamce_from_conf(cls, setting=None):
        print(cls)
        obj=cls(setting.IP,setting.PORT)

9.反射机制

主要看四个函数
hasarr()
getarr()
setarr()
delarr()

class Human:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def prt(self):
        print(self.age, self.name)


obj = Human("manba", 66)
# print(dir(obj))

#查询是否存在属性 hasattr
print(hasattr(obj, 'x'))

#得到属性的值 getattr
print(getattr(obj, 'name'))

#修改属性的值 setattr
setattr(obj, 'name', '李白')
print(obj.name)

#删除属性的值 delattr
delattr(obj, 'name')
print(obj.__dict__)


class Ftp:
    def put(self):
        print('正在上传数据')

    def get(self):
        print("正在下载数据")

    def interact(self):
        opt = input("输入想要进行的指令>>>")
        getattr(self, opt, self.warning)()

    def warning(self):
        print('改功能不存在')


obj = Ftp()
obj.interact()

10.内置方法

内置方法在满足时候自动执行


class Human:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __str__(self):
        return f'<{self.name}:{self.age}>'

obj=Human("张大仙",66)
print(obj.__str__())
print(obj)
  • _str_
  • _del_:对象删除时候时先执行
  • _init_
  • _call_:
class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age


obj = Test("niu",66)
obj()

image

class Test:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __call__(self,*args,**kwargs):
        print(self.name,self.age)

obj = Test("niu",66)
obj()

image

11.元类

定义:实例化产生类的类
创建元类的步骤:


#1.类名
class_name='Human'

#2.基类
class_bases=(object,)

#3.执行类子代码,产生名称空间
class_dic={}
class_body="""
def __init__(self,name,age):
    self.name=name
    self.age=age

def prt(self):
    print(self.age,self.name)
"""
exec(class_body,{},class_dic)
print(class_dic)


#4.调用元类
Human=type(class_name,class_bases,class_dic)
# print(Human)
obj=Human('zdx',77)


调用内置元类type的__call__

  1. 调用Mytype的__new__方法,初始化对象Human
  2. 调用Mytype的init方法,初始化对象Human
    3.返回初始化好的对象Human

11.枚举与拉链

  • enumerate枚举:
li=['a','b','c','d']
for index,value in enumerate(li,1):
    print(index,value)

后面的参数用于设置初始时候下标从哪个数字开始计算
image

  • zip拉链:
li2=['1','2','3','4']
li3=['1','2','3']
for i in zip(li,li2,li3):
    print(i)

12.eval和exec

  • eval:
b=2
g={'b':4} #全局名称空间
l={"b":5} #局部名称空间
res=eval('1+b',g,l)
print(res)
# print(l)

image

  • exec:
res=exec(input('>>>'))
print(res,type(res))

13.异常处理

try:
  子代码块
except 异常类型1 as e:
  子代码快
except 异常类型2 as e:
  子代码块
except 异常类型3 as e:
  子代码块
except Exception as e:
  子代码块
else:
  子代码块:会被检测代码
finally:
  子代码块4

实例:


print("开始")
try:
    print('1'.center(20,'*'))
    num='abc'
    int(num)

    a=[1,2,3]
    print(a[10])


except ValueError  as e:
    print("异常处理信息:",e)
    print("异常处理成功")
except Exception as e:
    print("出现其他异常")
    print("异常处理信息:",e)
    print("异常处理成功")
finally:
    print("程序执行完毕")
print("结束")

image

posted @ 2025-07-11 15:27  屈臣  阅读(6)  评论(0)    收藏  举报