zoukankan      html  css  js  c++  java
  • 初识面向对象:类

    定义一个类:

        class 类名(大写开头)
        静态变量            
        函数 : 方法       #动态属性  # 类中可以定义方法,方法都有一个必须传的参数self
        变量 : 类属性    #静态属性  # 类中可以定义静态属性         

    例:

    class Tst:
        nationality = '中国' #静态变量,不能通过双下dict方法修改,不能在外部通过对象调用修改,可以查看,可以在外部通过类名调用修改,
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
            print(id(self))#self与t1的内存地址一样
    
        def way(self):#方法,一般情况下必须传self参数,且必须写在第一个;后面还可以传其他参数,是自由的
            pass
    
    t1 = Tst('aike','25','')                   #所以t1接收的是self的内存地址
    print(Tst.nationality)                          #查看静态变量
    print(Tst.__dict__['nationality'])              #同样可以使用双下dict方法查看静态变量值
    # Tst.__dict__['nationality'] = '美国'            #报错,所以静态变量不能通过双下dict方法修改
    Tst.nationality = '美国'
    print(Tst.nationality)                       #通过类直接调用可以修改
    print(t1)                                       #返回的是一个内存地址,与self一样
    print(id(t1))                                   #self与t1的内存地址一样
    print(t1.name)                                  #查看属性值
    print(t1.__dict__)                              #通过双下dict方法能够查到里面的数据,内存地址与一致,所以数据也是一致
    print(t1.__dict__['name'])                      #同样可以使用双下dict方法查看属性值
    t1.__dict__['name'] = '艾克'                      #使用双下dict方法可以修改属性值
    print(t1.__dict__['name'])
    
    t1.way()                                        #可以用对象直接调用方法,等同于Tst.way(t1),如果方法不止接收一个参数,在括号内部依次传入即可            

     

    过程:
    类名() 首先 会创造出一个对象,创建了一个self变量
    调用init方法,类名括号里的参数会被这里接收
    执行init方法
    返回self
    __init__方法:初始化方法
    python帮我们创建了一个对象self
    每当我们调用类的时候就会自动触发这个方法。默认传self
    在init方法里面可以对self进行赋值
    对象能做的事:
    查看属性
    调用方法
    __dict__ 对于对象的增删改查操作都可以通过字典的语法进行

    类名能做的事:
    实例化
    调用方法 : 只不过要自己传递self参数
    调用类中的属性和对象,也就是调用静态属性和对象
    __dict__ 对于类中的名字只能看 不能操作

    总结: 

      1、实例化的过程就是类——>对象的过程,创建的对象就是一个实例化的东西

      2、self在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做。self拥有属性都属于对象,在类的内部,self就是一个对象

      3、对象通过双下dict方法能够查到这个对象的数据,内存地址与self一致,所以数据也是一致

      4、静态变量可以在类的外部通过双下dict方法查看,但不能修改,可以通过类名调用修改

      5、对象调用方法的方式需要细心

    补充:关于类和对象的命名空间

    #静态属性为不可变数据类型
    class Person:
        state = 'chinese'
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    aike = Person('aike',25,'')
    chenfan = Person('chenfan',25,'')
    print(aike.state) #chinese
    print(chenfan.state) #chinese
    aike.state = 'US'
    print(aike.state)#US
    print(Person.state)#chinese
    print(chenfan.state)#chinese
    Person.state = 'UK'
    print(Person.state)#UK
    print(aike.state)#US 上面的aike.state = 'US'是在给aike赋值,因为对象找变量优先找自己的,没有就找类的,类没有则报错,不会找全局的
    print(chenfan.state)#UK
    #当静态变量为可变数据类型时
    class Person:
        state = ['chinese'] #列表
        def __init__(self,name,age,sex):
            self.name = name
            self.age = age
            self.sex = sex
    
    aike = Person('aike',25,'')
    chenfan = Person('chenfan',25,'')
    print(aike.state)#['chinese']
    print(chenfan.state)#['chinese']
    aike.state[0] = 'US'
    print(aike.state)#['US']
    print(chenfan.state)#['US']
    chenfan.state = 'UK' #重新赋值
    print(chenfan.state)#UK
    print(aike.state)['US']

    结论:

    1、对象调用类中的静态变量时,会优先找自己的,如果自身没有,则找类的,类没有不再向全局找,直接报错

    2、当类的静态变量为不可变数据类型时,对象调用静态变量对其值进行修改,不会影响到静态变量的原始值,而是直接在对象自身的内存创建一个新的变量赋值

    3、当类的静态变量为可变数据类型时,对象调用静态变量对其值进行修改,修改时共享的,会影响原始值,其他对象调用也会被影响,重新赋值又是独立的,与不可变数量类型一样。

    4、类变量最好用类名操作

  • 相关阅读:
    浅谈生成全排列的4种方法
    UVA
    UVA
    UVA
    UVA
    MySQL索引篇
    MySQL事务篇
    MySQL架构篇
    Redis性能调优
    Redis分布式锁
  • 原文地址:https://www.cnblogs.com/aizhinong/p/11440267.html
Copyright © 2011-2022 走看看