• 面向对象


    一  类

     1类的定义:

    我们知道在面向对象编程中,类是我们虚拟出来的用来表示一系列对象特征与功能的结合体。

     2类的实例化:

    我们通过调用类产生对象的过程称为类的实例化,实例化的结果就是一个对象,或者叫一个实例。

    我们先定义一个类:
    class Poeple:
        def __init__(self,name,age,sex):
            self.name=name    #self在这里就相当于一个空的对象,我们在产生对象的时候对空对象进行特殊化处理,
            也就是说如果我们不进行特殊化那么产生的所有对象都是一样的。
            self.age=age
            self.sex=sex
    
        def run(self):
            print('%s is running ..'%self.name)#这里的self.name就相当于我们下面的obj1.name
    print(Poeple.__dict__)
    obj=Poeple('egon',18,'male')#我们通过调用Poeple自动触发类内的__init__函数进行,将传入的值赋给对象obj1,
    那么其实Poeple中需要传入四个值,而这里将产生的第一个空对象也就是obj1传给了self。
    就相当于:Poeple.__init__(obj,'egon',18,'male')===〉〉obj=Poeple('egon',18,'male')
    print(obj.name)
    print(obj.age)
    print(obj.sex)
    print(obj)#输出为obj这个对象所在的内存地址。
    在实例化的过程中,具体发生了三件事:
    1首先产生一个空对象,
    2自动触发类内部的——init——函数的执行
    3然后将空对象stu1连同调用类时括号内传入的参数组成(stu1,name,age,sex)将这四个参数一起传给——init——函数。

    3对象的操作:增,删,改,查。
    那么先说增:
    obj.hobby='play'
    print(obj.__dict__)
    删
    del obj.hobby
    print(obj.__dict__)
    改
    obj.name='alex'
    print(obj.__dict__)
    查
    print(obj.name)
    同样的也可以:
    print(obj.__dict__['name'])
    print(obj.age)
    print(obj.sex)
    4 对象属性的查找顺序:
    4.1 先找对象自己所在的名称空间,然后在去到类的名称空间去找,
    这里需要强调一点就是,类的名称空间与对象的名称空间没有包含关系,是相互独立的。
    print(obj)
    print(Poeple('egon',18,'male'))
    class Poeple:
        x=3
        def __init__(self,name,age,sex,):
            self.name=name
            self.age=age
            self.sex=sex
    obj=Poeple('alex',73,'female')
    obj2=Poeple('alex1',34,'male')
    obj3=Poeple('alex2',45,'male')
    
    print(obj.x,id(obj.x))  #3 1648193056
    obj.x=2222222222    #在这改变x的值,并不会改变最后输出的值。
    
    print(obj3.x,id(obj3.x))      #3 1648193056
    print(obj2.x)     #3
    Poeple.x=333333333   #我们可以通过类Poeple来改变
    print(obj3.x,id(obj3.x))      #333333333   98717568816
    print(obj2.x)     #3333333333333
    # 
    由此可以得出类的数据类型是给对象用的,而且直接共享给所有的对象用,
    我们可以看出所有的对象都指向同一个地址。
    5
    4.2、类的函数属性
    也是给对象用,但是他是绑定给对象用的,绑定到不同的对象就是不同的
    绑定方法,内存地址都不一样,但其实功能是一样的。也就是说谁使用谁调用跟其他对象的没关系。
    class People:
        x=1
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        def run(self): #self=obj
            print('%s is running' %self.name) #obj.name
    
    print(People.run) #<function People.run at 0x00000226E7C78A60>
    People.run(123123)
    People.run(obj)
    obj=People('egon',16,'female')
    obj1=People('alex',16,'female')
    obj2=People('zhang',16,'male')
    print(obj.run)##<bound method People.run of <__main__.People object at 0x000000C591EF7A58>>
    print(obj1.run)##0x000000C591EF7A90
    print(obj2.run)##0x000000C591EF7AC8
    四:绑定方法的特殊之处:
    1、 绑定给谁就应该由谁来调用,
    2、谁来调用就会把谁当做第一个参数传入
    class People:
        x=1
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex
    
        def run(self): #self=obj
            print('%s is running' %self.name) #obj.name
    
        def f1():#我们在这里运行并不会报错,只有调用时才会报错
            print('from f1')
    
        def f2(self):
            pass
    
    obj=People('egon',18,'male') #People.__init__(obj,'egon',18,'male')
    obj1=People('egon1',18,'male') #People.__init__(obj,'egon',18,'male')
    obj2=People('egon2',18,'male') #People.__init__(obj,'egon',18,'male')
    #
    obj.run()
    obj1.run()
    obj2.run()
    
    print(People.f1)
    People.f1()
    print(obj.f1)
    obj.f1() #People.f1(obj)#这里当我们通过对象来调用类中的函数f1(),会向f1()传参数,
    但是f1被我们定义成无参函数。
     
    五 一切皆对象
    l1=[1,2,3,4,4]
    print(l1,type(l1))####[1, 2, 3, 4, 4] <class 'list'>
     l1.append('x')
    
     print(l1)
     print(l1,list.append(l1,'x'))
     我们可以看出来其实l1.append(‘a’)与list.append(l1,‘a’)结果是一样的。
     在python3中类就是类型。那么我们之前学过的list,tuple等都是类。






    #
  • 相关阅读:
    关于换位思考
    C# 4.0 新特性之参数
    短信猫和短信网关
    win7中cookies位置(IE)
    IIS6.0应用程序池回收和工作进程
    深入理解IIS工作原理
    IIS的启动与停止命令
    汉字和Unicode码(utf8)之间的转换(Pack/Unpack)
    用struct模块处理二进制数据
    python: string的操作函数
  • 原文地址:https://www.cnblogs.com/zhangsanfeng/p/8797341.html
Copyright © 2020-2023  润新知