Python面向对象程序设计
目录
一、类和对象
二、Python中的类
三、对象的比较
1、python中的类的比较
2、自定义类的比较
四、静态属性和静态方法
五、集合元素和字典的键中的对象
1、集合元素和字典的键
2、object类
3、关系
一、类和对象
①类就是用来代表事物的,对于一种事物,可以设计出一个类,来概括出这个事物的属性,这个属性用成员变量表示,还要有对应的这个事物能进行的操作,我们用成员函数来表示
②成员变量也称类的“属性”,而成员函数也称类的“方法”
③类的示例,称为“对象”,类代表一种事物的共同特点,对象就是一个具体的事物的个体
-
类(Class):是一个模板,定义了某种事物的共同特征(成员变量)和行为(成员函数)
-
成员变量(Attributes):是类中用来存储数据的变量,表示对象的状态。
-
成员函数(Methods):是类中定义的函数,表示对象的行为。
-
对象(Object):是类的具体实例,它包含了类定义的所有成员变量和成员函数。
例子:
class Animal:def __init__(self, name):self.name = name#这个名字就是成员变量def make_sound(self):pass#这个叫声就是成员函数class Dog(Animal):def make_sound(self):return "汪"class Cat(Animal):def make_sound(self):return "咪咪咪"class Human(Animal):def make_sound(self):return "呀呼"#以上三个就是类的定义,每一个里面包含了一个成员函数dog = Dog("Dog")
cat = Cat("Cat")
human = Human("Human")#类的实例化print(dog.name, "的叫声是:", dog.make_sound())
print(cat.name, "的叫声是:", cat.make_sound())
print(human.name, "的叫声是:", human.make_sound())
中间的三个类可以看成最上面那个抽象类的子类
一个类包含成员变量和成员函数,我们通过继承,来使他具象一些,所有Animal就是抽象类,剩下三个就是具体类
二、Python中的类
类型名即是类名,如float,str等
小数,复数,字符串,元组,列表,集合,字典等组合数据类型的常量,都是对象,函数也是对象,但整数常量不是对象
而我们之前学到的库,如turtle,jieba等,都是一个类
三、对象的比较
1、python中的类的比较
在Python中的所有类,以及自己自定义的类,都有__eq__方法
x == y 的值,就是x.__eq__(y)的值,如果x.__eq__(y)没定义,就是y.__eq__(x)的值,如果两者都没定义,那么 x == y 也没定义
x != y 的值,就相当于x.__ne__(y)的值,等价于 not x.__ne__(y)
下面还有几个比较方面的类:
代码 | 对应的类 |
a < b | a.__lt__(b) |
a > b | a.__gt__(b) |
a <= b | a.__le__(b) |
a >= b | a.__ge__(b) |
以上涉及的不包括整数型常量
2、自定义类的比较
默认情况下,一个自定义的a.__eq__(b)方法,功能是判断两者是不是相等
默认情况下,一个自定义的对象不能比较其大小,因为那些方法都被Python设置成了None
默认情况下虽然不能进行比较大小,但是我们可以通过方法重写来使得我们可以进行大小的比较
例子:
class point :def __init__(self , x , y = 0):self.x , self.y = x , ydef __eq__(self, other):return self.x == other.x and self.y == other.y #进行了重写def __lt__(self, other):if self.x == other.x :return self.y < other.yelse :return self.x < other.xa , b = point(1 , 2) , point(1 , 2)
print(a == b)
print(a != b)
print(a < point(1 , 3))
在上面的代码中,我们对eq方法进行了重写,使得我们自己定义的这个类可以进行大小的比较,我们看看输出:
我们可以看见这个是可以进行判断相等和大小比较的:
如果我们把eq方法注释掉,就是默认的eq方法:
此时上面两个输出就完全相反
四、静态属性和静态方法
①静态属性被所有对象所共享,一共就一份
②静态方法不是作用在具体的某个对象上,它不会受所在类的参数的限制,且它不能访问非静态属性
③静态方法和静态属性的存在,就是为了减少全局变量和全局函数
我们下面来举一个例子具体指出静态变量和静态方法是什么样子的:
class employee :total_salary = 0 #----这就是静态变量def __init__(self , name , income):self.name = nameself.income = incomedef pay(self , salary):self.income += salary #个人工资employee.total_salary += salary #总和@staticmethod #这就是静态方法def print_total_salary():print(employee.total_salary)e1 = employee("Tom" , 0)
e2 = employee("LiHua" , 0)e1.pay(1000)
e2.pay(1500)employee.print_total_salary()
e1.print_total_salary()
e2.print_total_salary() #访问的都是print_total_salary()函数,所以输出一样
输出:
五、集合元素和字典的键中的对象
1、集合元素和字典的键
在Python中,能作为集合元素和字典的键的条件,是这个东西可哈希
如果hash(x)有定义,这个x就是可哈希的
如果x是整型常量,则hash(x)= x
如果x不是整型常量,则hash(x)= x.__hsah__()
object类有__hsah__()方法,返回值是一个整数
2、object类
所有类都是都是object类的派生类,因而具有object类的各种属性和方法
我们可以通过dir函数来查看一个类的方法:
class Example :def func(self):passprint(dir(Example))
3、关系
①字典和集合都是“哈希表”数据结构,根据元素的哈希值为元素找存放的“槽”,哈希值可以看作是槽的编号
②若a,b两个对象的哈希值不同,则可以作为同一个集合里面的元素,以及同一个字典里的两个键
③若a,b两个对象的哈希值一样,但是a == b不成立,则也可以作为同一个集合里面的元素,以及同一个字典里的两个键
④自定义的对象,默认情况下哈希值是根据对象的id进行计算哈希值的,所以两个对象,只要a is b不成立,两者的哈希值就不一样
⑤可通过重写自定义类的__hash__()方法,使得对象的值和对象的哈希值不是和id相关,这样值相同的对象就不能在一个字典和集合中了
⑥一个自定义类,只有在重写了eq方法,但是没有重写hash方法的情况下,才是不可哈希的
以上就是Python面向对象程序设计的全部内容:)