什么是类?什么是对象?

  类是抽象的,代表着一类事物的属性和方法,但不知道具体的值

  对象是有具体的值,属性和方法都根据类规范

  类名的作用:查看操作属性

# 对象 = 类名()  # 实例化
# 过程:
    # 类名() 首先 会创造出一个对象,创建了一个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())

 

posted on 2019-05-24 09:20  幸福的小耗子  阅读(140)  评论(0编辑  收藏  举报