目录
面向对象编程 Object Oriented Programming
面向对象编程 Object Oriented Programming
类与对象是面向对象编程的两个主要方面。
一个类( Class) 能够创建一种新的类型( Type) , 其中对象( Object) 就是类的实例( Instance) 。
可以拥有类型 int 的变量, 也就是说存储整数的变量是 int 类的实例( 对象) 。
类的属性(Attribute):
1. 字段(Field):对象可以使用属于它的普通变量来存储数据。 这种从属于对象或类的变量叫作字段 。字段的两种类型为类变量与对象变量。
字段与普通变量:字段是绑定( Bound) 到类与对象的命名空间( Namespace)的普通变量。
类变量( Class Variable):被类中所有实例共享及访问,只存在一个副本,当任何一个对象对类变量作出改变时, 发生的变动将在其它所有实例中都会得到体现。
如下例中的population,需要用Sutdent.population进行引用。
对象变量( Object variable):由类的每一个独立的对象或实例所拥有,不被共享,每个对象都拥有从属的字段和副本,各不关联。
如下例中的name,需要用self.name进行引用。
class Student:
population = 0
def __init__(self, name):
self.name = (name)
print ('Here comes a student: {}'.format(self.name))
Student.population += 1
def graduate(self):
print('{} graduates! Congratulations!'.format(self.name))
Student.population -= 1
if Student.population == 0:
print('All students graduated!')
else:
print('We have {:d} students in our class.'.format(Student.population))
@classmethod
def how_many(cls):
print('We have {:d} students in our class'. format(cls.population))
stu1 = Student('Sarah')
stu2 = Student('Sandra')
stu3 = Student('Sara')
Student.how_many()
stu1.graduate()
stu2.graduate()
stu3.graduate()
Here comes a student: Sarah
Here comes a student: Sandra
Here comes a student: Sara
We have 3 students in our class
Sarah graduates! Congratulations!
We have 2 students in our class.
Sandra graduates! Congratulations!
We have 1 students in our class.
Sara graduates! Congratulations!
All students graduated!
这里的how_many是一个classmethod修饰符对应的函数,该类函数调用时不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数。
2. 方法(Method):对象还可以使用属于类的函数来实现某些功能, 这种函数叫作类的方法。
类方法与普通函数:类方法必须多加一个参数在参数列表开头, 按照惯例, 它被赋予 self 这一名称。但调用时无需赋值。
class Person:
def say_hi(self):
print('Hello, how are you?')
p = Person()
p.say_hi()
# 前面两行同样可以写作
# Person().say_hi()
Hello, how are you?
__init__方法
在类的对象被实例化(创建)时立即运行,用于初始化对象。
class Person:
def __init__(self, name):
self.name = name
def say_hi(self):
print('Hello, how are you?', self.name)
Person('Vio').say_hi()
Hello, how are you? Vio
继承 Inheritance
继承可在类之间实现类型与子类型的关系。
基类可作为公共类,使子类可从这个类中继承共有的特征, 也就是说他们将成为这一类型( 类) 的子类型, 而我们就可以向这些子类型中添加某些该类独有的特征。
为了使用继承,在定义类时需要在类后面跟一个包含基类名称的元组。
class Subclass(Superclass)
如下例中,SchoolMember 类会被称作基类( Base Class) 或是超类( Superclass) 。 Teacher 和 Student 类会被称作派生类( Derived Classes) 或是子类( Subclass) 。
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: "{}"'.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: "{}"'.format(self.marks))
t = Teacher('Cecile', 30, 40000)
s = Student('Vio', 24, 100)
members = [t, s]
for member in members:
member.tell()
Initialized SchoolMember: Cecile
Initialized Teacher: Cecile
Initialized SchoolMember: Vio
Initialized Student: Vio
Name: "Cecile" Age: "30" Salary: "40000"
Name: "Vio" Age: "24" Marks: "100"