欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python6:oriented objective programming

程序员文章站 2022-03-02 12:13:06
...

1.introduction

前面采用操作数据的函数或语句块来设计程序,也就是面向过程编程。把数据和功能结合起来,用对象的包裹起来组织程序,就是面向对象编程。在大多数时候可以使用过程性编程,但是想要编写大型程序时,就得使用面向对象的编程技术。
对象是面向对象编程的两个主要组建。类可以创建一个新类型,对象是这个类的实例。
对象可以使用普通的属于对象的变量存储数据,属于一个对象或类的变量称为域。对象基于累的函数实现功能(类的方法)。

2.self

类方法与普通函数只有一个特别的区别——必须有一个额外的第一个参数名称,但是在调用这个方法的时候不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例是self。
Python中的self等价于C++中的self指针和Java、C#中的this参考。
假如有一个类MyClass和类的实例MyObject。当调用这个对象的方法MyObject.method(arg1, arg2)的时候,由Python自动转为MyClass.method(MyObject,arg1,arg2)——这就是self的原理了。
  • 创建一个最简单的类
class Person:
    pass;# an empty block
p = Person();
print p;
输出为:
<__main__.Person instance at 0x000000000AE48A88>
class语句后面跟着类名,创建了一个新类。后面的缩进语块形成类体,上例中,使用了一个空白块,由pass语句表示。
类名后面跟着一对圆括号来创建一个对象/实例 p = Person();
为了验证,本例简单打印了这个变量的类型,他告诉我们,我们已经__main__模块中有了一个Person类的实例。当然,本例中也给出了储存对象的计算机内存地址。

3.对象的方法

类/对象可以拥有像函数一样的方法,这些方法与函数的区别只是一个额外的self变量。
class Person:
    def sayHello(self):
        print 'Hello,how are you?';
p = Person();
p.sayHello();
#be equal to
#Person().sayHello();
输出为:
Hello,how are you?
这里可以看到self的用法,sayHello()方法没有任何参数,但是仍然在函数定义时有self。

4.__init__方法

Python类中有很多方法的名字有特殊的重要意义。__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对对象做一些希望的初始化。
class Person:
    def __init__(self,name):
        self.name = name;
    def sayHello(self):
        print 'Hello,how are you?',self.name;
p = Person('Ziheng');
p.sayHello();
输出为:
Hello,how are you? Ziheng
__init__方法类似于C++、C#和Java中的constructor 。

5.类与对象的方法

类与对象的数据部分只是与类和对象的名称空间绑定的普通变量,即这些名称只在这些类与对象的前提下有效。有两种类型的域 ——类的变量和对象的变量,根据是类还是对象拥有这个变量而区分。
类的变量由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上
对象的变量由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷贝,即它们不是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。
class Person:
    '''Represents a person.'''
    population = 0
    def __init__(self, name):
        '''Initializes the person's data.'''
        self.name = name
        print '(Initializing %s)' % self.name
        # When this person is created, he/she
        # adds to the population
        Person.population += 1
    def __del__(self):
        '''I am dying.'''
        print '%s says bye.' % self.name
        Person.population -= 1
        if Person.population == 0:
            print 'I am the last one.'
        else:
            print 'There are still %d people left.' % Person.population
    def sayHi(self):
        '''Greeting by the person.
        Really, that's all it does.'''
        print 'Hi, my name is %s.' % self.name
    def howMany(self):
        '''Prints the current population.'''
        if Person.population == 1:
            print 'I am the only person here.'
        else:
            print 'We have %d persons here.' % Person.population
swaroop = Person('Swaroop')
swaroop.sayHi()
swaroop.howMany()

kalam = Person('Abdul Kalam')
kalam.sayHi()
kalam.howMany()

swaroop.sayHi()
swaroop.howMany()
输出为:
Python6:oriented objective programming
population属于Person类,因此是一个类的变量。name变量属于对象(它使用self赋值)因此是对象的变量。
就如同__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。在这个方法里面,我们只是简单地把Person.population减1。

6.继承

class SchoolMember:
    '''Represents any school member.'''
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print '(Initialized SchoolMember: %s)' % self.name
    def tell(self):
       '''Tell my details.'''
       print 'Name:"%s" Age:"%s"' % (self.name, self.age);
class Teacher(SchoolMember):
    '''Represents a teacher.'''
    def __init__(self, name, age, salary):
        SchoolMember.__init__(self, name, age)
        self.salary = salary
        print '(Initialized Teacher: %s)' % self.name
    def tell(self):
        SchoolMember.tell(self)
        print 'Salary: "%d"' % self.salary
class Student(SchoolMember):
    '''Represents a student.'''
    def __init__(self, name, age, marks):
        SchoolMember.__init__(self, name, age)
        self.marks = marks
        print '(Initialized Student: %s)' % self.name
    def tell(self):
        SchoolMember.tell(self)
        print 'Marks: "%d"' % self.marks
t = Teacher('Mrs. Shrividya', 40, 30000)
s = Student('Swaroop', 22, 75)
print # prints a blank line
members = [t, s]
for member in members:
    member.tell() # works for both Teachers and Students
Python6:oriented objective programming