(Python第七天)类

一、定义类

 所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

以下面这种方式定义类:

class nameoftheclass(parent_class):
    statement1
    statement2
    statement3  

在类的声明中可以写任何Python语句,包括定义函数

2)__init__方法

类的实例化使用函数符号,只要将类对象看作是一个返回新的类实例的无参数函数即可

x=MyClass()  该语句创建了一个新的类实例并将该对象赋给局部变量x,这个实例化操作创建了一个空的对象,很多类都倾向于将对象创建为有初始状态的,因此类会定义一个名为__init__()的特殊方法,如

def __init__(self):
    self.data=[]  

类定义了__init__()方法的话,类的实例化操作会自动为新创建的类实例调用__init__()方法.

这个方法就是pyhton的构造方法,

3)继承

当一个类继承另一个类时,它将继承父类的所有功能(变量和方法)

实例:创建一个叫做person的类,然后创建两个派生类student和teacher,当两个类都从person类继承时,它们的类除了会有person类的所有方法还会有自身用途的新方法和新变量,

 1 class Person(object):
 2     """
 3     返回具有给定名称的 Person 对象
 4     """
 5 
 6     def __init__(self, name):
 7         self.name = name
 8 
 9     def get_details(self):
10         """
11         返回包含人名的字符串
12         """
13         return self.name
14 
15 
16 class Student(Person):
17     """
18     返回 Student 对象,采用 name, branch, year 3 个参数
19     """
20 
21     def __init__(self, name, branch, year):
22         Person.__init__(self, name)
23         self.branch = branch
24         self.year = year
25 
26     def get_details(self):
27         """
28         返回包含学生具体信息的字符串
29         """
30         return "{} studies {} and is in {} year.".format(self.name, self.branch, self.year)
31 
32 
33 class Teacher(Person):
34     """
35     返回 Teacher 对象,采用字符串列表作为参数
36     """
37     def __init__(self, name, papers):
38         Person.__init__(self, name)
39         self.papers = papers
40 
41     def get_details(self):
42         return "{} teaches {}".format(self.name, ','.join(self.papers))
43 
44 
45 person1 = Person('Sachin')
46 student1 = Student('Kushal', 'CSE', 2005)
47 teacher1 = Teacher('Prashad', ['C', 'C++'])
48 
49 print(person1.get_details())
50 print(student1.get_details())
51 print(teacher1.get_details())

在student和Teacher类中重写了Person类的get_details()方法,当我们调用student1和teacher1的get_details()方法时,使用的是各自类(Student和Teacher)中定义的方法

4)多继承

一个类可以继承自多个类,具有父类的所有变量和方法

5)删除对象

使用关键字del来删除对象

6)属性读取方法

直接使用属性可以

 

7)装饰器

想要更精确的调整控制属性访问权限,可以使用@property装饰器,@property装饰器就是负责把一个方法变成属性调用的

实例:确保没有人能设置金额为负,并且有个只读属性cny返回换算人民币后的金额

 1 class Account(object):
 2     """账号类,
 3     amount 是美元金额.
 4     """
 5     def __init__(self, rate):
 6         self.__amt = 0
 7         self.rate = rate
 8 
 9     @property
10     def amount(self):
11         """账号余额(美元)"""
12         return self.__amt
13 
14     @property
15     def cny(self):
16         """账号余额(人民币)"""
17         return self.__amt * self.rate
18 
19     @amount.setter
20     def amount(self, value):
21         if value < 0:
22             print("Sorry, no negative amount in the account.")
23             return
24         self.__amt = value
25 
26 if __name__ == '__main__':
27     acc = Account(rate=6.6) # 基于课程编写时的汇率
28     acc.amount = 20
29     print("Dollar amount:", acc.amount)
30     print("In CNY:", acc.cny)
31     acc.amount = -100
32     print("Dollar amount:", acc.amount)

 

posted @ 2019-01-22 23:57  ywangji  阅读(226)  评论(0编辑  收藏  举报