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()
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种创建字典的方式
推荐阅读
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
-
荐 夯实基础,彻底掌握js的核心技术(二):面向对象编程(Object Oriented Programming)
-
C++Primer第五版 习题答案 第十五章 面向对象程序设计(Object-Oriented Programming)
-
Python面向对象编程(Object Oriented Programming,OOP)之初识
-
AOP: Aspect Oriented Programming
-
荐 夯实基础,彻底掌握js的核心技术(二):面向对象编程(Object Oriented Programming)
-
Spring Aspect Oriented Programming
-
Object Oriented Programming (2)
-
Object Oriented Programming (3)
-
【334】Python Object-Oriented Programming