一类与对象

引入 在面向对象编程中,最重要的两个核心概念就算类和对象。对象是现实生活中具体存在的事情,它可以看得见摸得着,比如,你现在手里的电脑,就是一个对象,我们也是一个对象,是人类的对象。

1.类的定义(书本P201页)
1.1类的组成(书本P201)
(1)类名:类的名称,它的首字母必须是大写,如猫 Cat
(2)属性:用于描述事物的特征,比如 猫的年龄
(3)方法:用于描述事物的行为,比如,猫具有跑步的行为
1.1基本语法格式:例如
class Cat:
#属性
#方法
使用类创建对象,并添加属性
如何定义类:例子
class MyClass:
i = 12345#属性
def f(self): #方法
print(“这就是我想要的”)

实例化类

x = MyClass()

访问类的属性和方法

print(“MyClass 类的属性 i 为:”, x.i)
print(“MyClass 类的方法 f 输出为:”, x.f())

二 构造方法和折构方法

python的构造和析构函数为固定的名字
在Python程序中,有两种特殊的方法即:init() 的特殊方法(构造方法)和_del_()方法。

1.init()构造方法

(1)__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
(2)、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去:
1 构造方法在类实例化时会自动调用,像下面这样:
def init(self):
self.data = []

类定义了 init() 方法,那么类的实例化操作会自动调用 init() 方法。如下实例化类 MyClass,对应的 init() 方法就会被调用:
x = MyClass()
构造方法使用课堂例子P203—P204
#定义类

class Car:
    #带参构造方法
    def __init__(self, color):
        self.color = color
    def toot(self):
            print("%s颜色的车在鸣笛..."%self.color)
bmw = Car("白")
yy = Car("红")
bmw.toot()
yy.toot()

2折构方法

当删除一个对象来释放类所占用资源的时候,Python解释器默认会调用另外一个方法,这个方法就是__del__( )方法。
如何使用:例子
#定义类

class Car:
    #带参构造方法
    def __init__(self, color):
        self.color = color
    def toot(self):
            print("%s颜色的车在鸣笛..."%self.color)
    def __del__(self):
        print(" ———def————")
bmw = Car("白")
w=bmw.toot()
del bmw
print("___1__")

三 self的使用

首先我们知道self的字面意思是自己,表示的是对象自身,我们可以把它当成java里的this指针理解。当某个对象调用方法的时候,Python解释器会把这个对象作为第一个参数传给self,开发者只需要传递后面的参数就可以了。
Python中的self等同于Java中的this,表示当前对象,当前正在操作的对象,而不是当前类
例子:书本P205
#定义类

class Car:
    #带参构造方法
    def __init__(self, color):
        self.color = color
    def toot(self):
            print("%s颜色的车在鸣笛..."%self.color)
bmw = Car("白")
bmw.toot()
yy = Car("红")
yy.toot()

程序创建一个Car类,在_init_()方法中,通过参数设置color属性的初始值,然后在toot方法中获取了color的值
在第8行,程序创建了一个Car类的对象,设置了color属性的默认值白 ,让bmw指向了该对象所占用的内存空间。然后,bmw调用了toot方法,默认把bmw引用的内存地址赋值给self,这时self也指向了这块内存空间,执行第七行语句访问bmw 的color属性的值,所以会是白色。
另一个也是同样的道理。

1.介绍运算符重载方法(书本P206)
python的方法重载有些特殊,在python中,如下的代码并不能实现方法重载:

def Aa():
    pass
def Aa(a):
    print(1)
def Aa(a,b):
    print(2)

这里想调用Aa的无参数版本,但是解释器会报错,提示找不到Aa方法

Aa()
为什么会出现这种违法静态语言直觉的结果?因为,在python中,方法也是attribute,方法名就是Key,所以每个方法名只能有一个方法体,以上代码中,当Aa被定义了多次,每一次新的定义都会覆盖之前的定义,所以,可以在dir()中看到,Aa最终指向的函数体是Aa(a,b),但解释器发现调用Aa时却缺少两个参数,所以会报错。

在Java中,方法重载有针对两个场景:
参数类型不同
参数个数不同
实现加法运算符重载例子:

class suanshu:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __str__(self):
        return '加法(%d, %d)' % (self.a, self.b)
    def __add__(self, other):
        return suanshu(self.a + other.a, self.b + other.b)

v1 = suanshu(2, 10)
v2 = suanshu(5, -2)
print(v1 + v2)

面向对象练习题传送门