Success in life is a matter not so much of talent and opportunity as of concentration and perseverance.------C. W. Wendte
To us.
本文是学习Python 的笔记,只是记下来我认为重要的,易忘的notes,基于A byte of Python中文版Let it be!译。
-----------------------------------------
设计程序的时候有两种编程方法,一是面向过程,二是面向对象。
面向过程编程:根据操作数据的函数或语句块来设计程序;
面向对象编程:将数据和功能结合,用对象包裹起来的编程叫做面向对象编程,适用于编写大型程序或者寻求一个更加合适的解决方案时。
类和对象是面向对象编程的两主要方面,类创建一个新的类型,对象是类的实例,
属于一个对象或类的变量称为域,对象可以使用属于类的函数来具有功能,这样的函数称为类的方法。
之间的关系:
类:
类的方法和域
对象
1. self
类的方法和函数的唯一区别:类的方法有额外的第一个参数名称为self(也可以是任意名称,但是标准惯例是self),指的是对象本身,不用给self赋值,python会提供这个值为对象本身。就算是不需要参数的方法,还是需要给这个方法定义self参数。类里面的每一个方法都有self参数。
举个例子:
假如有一个类MyClass,它的实例MyObject,当调用这个对象的方法MyObject.method(arg1, arg2)时,会由python自动转为MyClass.method(MyObject, arg1, arg2)。
2. __init__方法
__init__方法用来对对象做初始化,在类的一个对象被建立时,马上运行。
class Person:
def __init__(self, name):
self.name = name # 它们是两个不同的变量
def sayhi(self):
print('Hello, my name is {0}.'.format(self.name))
p = Person('Gretchen')
p.sayhi()
# or Person('Gretchen').sayhi()
没有专门调用__init__方法,只是在创建一个类的新实例时,把参数包括在圆括号内跟在类名后面,这样传递给__init__方法。
3. 类变量和对象变量
根据是类还是对象拥有这个变量来区分类变量和对象变量。类变量是由一个类的所有实例(对象)共享使用,当类变量做改动时,这个改动会反映到所有实例上。对象变量由类的每个实例(对象)拥有,对于同一类额不同实例,对象变量互不相关。
使用person.population引用population类变量,用self.name引用name对象变量。
class Person:
population = 0
def __init__(self, name):
self.name = name # 它们是两个不同的变量
Person.population += 1
def sayhi(self):
print('Hello, my name is {0}.'.format(self.name))
p = Person('Gretchen')
p.sayhi()
# or Person('Gretchen').sayhi()
4. 类的继承
面向对象编程的好处之一是代码重用通过继承机制可以实现这种重用。当两个类拥有一些共用属性,并且各自具有自己的专有属性时,继承非常实用。
在父类中改变的功能会反映到子类中,但在一个子类中的改动不会影响到别的子类。
多态现象:一个子类在任何需要父类的场合下可以被替换成父类,即子类可被视作是父类的实例。例如在统计学校的人数时,老师、学生子类都属于学校人员类。
使用方法:把父类的名称作为一个元组跟在定义的子类名称之后。
class SchoolMember:
''' represent any school member'''
def __init__(self, name, age):
self.name = name
self.age = age
print('(Initialize schoolmember: {0})'.format(self.name))
def tell(self):
'''tell my details'''
print('name: "{0}" age: "{1}"'.format(self.name, self.age), end='')
class Teacher(SchoolMember):
'''represennt a teacher'''
def __init__(self, name, age, salary):
SchoolMember.__init__(self, name, age)
self.salary = salary
print('(Initialize teacher: {0})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print('salary: "{0:d}"'.format(self.salary)) # d表示salary输出整数的十进制
class Student(SchoolMember):
'''represennt a student'''
def __init__(self, name, age, marks):
SchoolMember.__init__(self, name, age)
self.marks = marks
print('(Initialize student: {0})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print('marks: "{0:d}"'.format(self.marks)) # d表示salary输出整数的十进制
t = Teacher('Mr.Mark', 30, 30000)
s = Student('Gretchen', 23, 99)
print()
members = [t, s]
for member in members:
member.tell()
python总是首先查找对应类型的方法,先在子类中找方法tell。
多重继承:如果在继承元组中列了一个以上的类,称为多重继承。