Python面向对象

🤔


面向对象的编程

类与对象是面向对象编程的两个主要方面。一个类能够创建一种新的类型 ,其中对象就是类的实例。可以这样来类比:你可以拥有类型 int 的变量,也就是说存储整数的变量是 int 类的实例。

即使是整数也会被视为对象。这不同于 C++ 与c#,在它们那儿整数是原始内置类型

  • 在Python中,一切皆为对象

对象可以使用属于它的普通变量来存储数据。这种从属于对象或类的变量叫作字段 。对象还可以使用属于类的函数来实现某些功能,这种函数叫作类的方法 。这两个术语很重要,它有助于我们区分函数与变量,哪些是独立的,哪些又是属于类或对象的。总之,字段与方法通称类的属性。
字段有两种类型——它们属于某一类的各个实例或对象,或是从属于某一类本身。它们被分别称作实例变量与类变量。


self

类方法与普通函数只有一种特定的区别——前者必须有一个额外的名字,这个名字必须添加到参数列表的开头,但是你不用在你调用这个功能时为这个参数赋值,Python 会为它提供。 这种特定的变量引用的是对象本身,按照惯例,它被赋􏰀 self 这一名称。

Python 中的 self 相当于 C++ 中的指针以及 Java 与 C# 中的 this 指针。


这是一个最简单的类:

1
2
3
class Person:  
pass # 空的代码块
p = Person() # 创建Person的对象p


方法

一个简单的方法:

1
2
3
4
5
class Person:  
def sayHi(self):
print(‘Hello, World’)
p = Person()
p.sayHi()
  • 输出: Hello, World

唯一与函数不同的地方在于这里多了一个self


继承

面向对象编程的一大优点是对代码的重用,重用的一种实现方法就是通过继承机制。继承指的是根据一个现有的类型,定义一个修改版本的新类的能力。继承最好是想象成在类之间实现类型与子类型关系的工具。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class SchoolMember: '''代表任何学校里的成员。'''
def __init__(self, name, age):
self.name = name
self.age = age
print('(Initialized SchoolMember: {})'.format(self.name))
def tell(self):
'''告诉我有关我的细节。'''
print('Name:"{}" Age:"{}"'.format(self.name, self.age), end=" ")
class Teacher(SchoolMember): '''代表一位老师。'''
def __init__(self, name, age, salary):
SchoolMember.__init__(self, name, age)
self.salary = salary
print('(Initialized Teacher: {})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print('Salary: "{:d}"'.format(self.salary))
class Student(SchoolMember): '''代表一位学生。'''
def __init__(self, name, age, marks):
SchoolMember.__init__(self, name, age)
self.marks = marks
print('(Initialized Student: {})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print('Marks: "{:d}"'.format(self.marks))
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 25, 75)
# 打印一行空白行 print()
members = [t, s]
for member in members:
# 对全体师生工作 member.tell()

有一些特征是他们都具有的,例如姓名、年龄和地址。另外一些特征是他们独有的,一如教师的薪水、课程与假期,学生的成绩和学费。你可以为每一种类型创建两个独立的类,并对它们进行处理。但增添一条共有特征就意味着将其添加进两个独立的类。这很快就会使程序变得笨重。
一个更好的方法是创建一个公共类叫作 SchoolMember ,然后让教师和学生从这个类中继承 ,也就是说他们将成为这一类型(类)的子类型,而我们就可以向这些子类型中添加某些该类独有的特征。
这种方法有诸多优点。如果我们增加或修改了 SchoolMember 的任何功能,它将自动反映在子类型中。举个例子,你可以通过简单地向 SchoolMember 类进行操作,来为所有老师与学生添加一条新的 ID 卡字段。不过,对某一子类型作出的改动并不会影响到其它子类型。另一大优点是你可以将某一老师或学生对象看作 SchoolMember 的对象并加以引用,这在某些情况下会大为有用,例如清点学校中的成员数量。这被称作多态性(Polymorphism),在任何情 况下,如果父类型希望,子类型都可以被替换,也就是说,该对象可以被看作父类的实例。
同时还需要注意的是我们重用父类的代码,但我们不需要再其它类中重复它们,当我们使用独立类型时才会必要地重复这些代码。

宇 wechat
扫描二维码,订阅微信公众号