初识面向对象:类

定义一个类:

    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、类变量最好用类名操作

posted @ 2019-08-31 20:10  aikell  阅读(167)  评论(0编辑  收藏  举报