什么是类?什么是对象?
类是抽象的,代表着一类事物的属性和方法,但不知道具体的值
对象是有具体的值,属性和方法都根据类规范
类名的作用:查看操作属性
# 对象 = 类名() # 实例化 # 过程: # 类名() 首先 会创造出一个对象,创建了一个self变量 # 调用init方法,类名括号里的参数会被这里接收 # 执行init方法 # 返回self # 对象能做的事: # 查看属性 # 调用方法 # __dict__ 对于对象的增删改查操作都可以通过字典的语法进行 # 类名能做的事: # 实例化 # 调用方法 : 只不过要自己传递self参数 # 调用类中的属性,也就是调用静态属性 # __dict__ 对于类中的名字只能看 不能操作
eg:矩形的周长和面积
class Rectangle: # 矩形的面积和周长 special = '我最好看' # 静态属性,只要是这个类就一定会有的属性,不需要实例化就可查看 def __init__(self,a,b): # 实例化时会创建一个self对象,会默认调用__init__方法接受参数 self.longSide = a # 最后self会返回给对象 self.shortSide = b def area(self): # 类中定义的方法必须传参,且必须写在第一个,当使用对象调用方法时默认self是对象本身 return self.longSide*self.shortSide def perimeter(self): return 2*(self.longSide+self.shortSide) r1 = Rectangle(5,6) # 实例化 print(r1.area(), r1.perimeter()) # 对象.方法() 调用方法 print(Rectangle.special, r1.special) # 静态属性可以用类名查看也可以用对象查看 print(r1.longSide) r1.longSide = 6 # 对象的修改操作 print(r1.longSide) r1.__dict__['longSide'] = 7 # 可以通过字典的方式修改 print(r1.longSide)
类命名空间与对象、实例的命名空间
1、创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
2、类有两种属性:静态属性和动态属性
- 静态属性就是直接在类中定义的变量,静态属性不能通过类的字典修改,但可以通过类名.属性名=' ' 修改
- 动态属性就是定义在类中的方法
3、静态属性是类共享给所有对象的,动态属性是绑定到所有对象的
注意:
1、对于不可变数据类型来说,类变量最好用类名操作
2、对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的
3、当对象调用类里方法时,把对象与方法产生了绑定关系,而类名调函数不产生绑定关系
class A: a = '我是一直小小鸟' l = [1] a_1 = A() a_2 = A() print(a_1.a, a_2.a, A.a) # 可以看到两个对象都有类的静态属性 a_1.a = '想要飞的更高' # 这时修改对象a_1的静态属性 print(a_1.a, a_2.a, A.a) # 发现只有对象a_1修改了,这是因为对象a_1创建了自己的a属性 A.a = '飞的更高' # 使用类名修改静态属性 print(a_1.a, a_2.a, A.a) # 发现对象a_2的属性跟着修改,a_1不变的原因是有了自己的a属性 del a_1.a # 这时删掉a_1对象自己的a属性 print(a_1.a, a_2.a, A.a) # 发现两个对象的属性都随类属性的变化而改变 print(a_1.l, a_2.l, A.l) a_1.l[0] = 'aaa' # 修改对象a_1的动态属性 print(a_1.l, a_2.l, A.l) # 发现所有的动态属性跟着变化 a_2.l = ['222'] # 对对象a_2.l进行重新赋值 print(a_1.l, a_2.l, A.l) # 发现只有a_2变化了
组合:一个对象的属性值是另一个类的对象
eg:圆环的面积与周长
from math import pi class Circle: def __init__(self,r): self.r = r def area(self): return pi*(self.r**2) def peremiter(self): return 2*pi*self.r class Ring: def __init__(self, out_r, in_r): self.out_circle = Circle(out_r) # 这里发生了组合,圆环的属性是圆类的对象 self.in_circle = Circle(in_r) def ring_area(self): return self.out_circle.area()-self.in_circle.area() def ring_peremiter(self): return self.out_circle.peremiter()+self.in_circle.peremiter() r = Ring(20,10) print(r.ring_area()) print(r.ring_peremiter())