面向对象编程
类与对象是面向对象编程的的两个主要方面,一个类可以创建一种新的类型,其中对象就是类的实例。
可以这样来类比:你可以拥有类型 int的变量,也就是说存储整数的变量是int类的实例(对象)。
- self
类与普通的函数只有一种特定的区别----前者必须多加一个参数在参数列表开头,这个名字必须添加到参数列表的开头,但是你不用在调用这个功能时,为这个参数赋值,Python会为他提供。
这个特定的变量引用的是对象本身,按照惯例,他被赋予self这一名字。 - 类
一个简单的类
class Person:
pass #一个空的代码块
p=Person()
print(p)
输出结果:
<__main__.Person instance at 0x10171f518>
- 方法
类与对象一如函数那般,都可以带有方法(Method),唯一的不同在于我们还有一个额外的self变量。
class Person:
def say_hi(self):
print('Hello,how are you?')
p=Person()
p.say_hi()
# 前面两行也可以写作:
# Peson().say_hi
输出结果:
Hello,how are you ?
- __init__方法
__init__方法会在类的对象被实例化时,立即运行。这一方法可以对任何你想进行操作的目标对象进行初始化操作。
class Person:
def __init__(self,name):
self.name=name
def say_hi(self):
print('Hello,my name is,self.name)
p=Person('Swaroop')
p.say_hi()
输出结果:
Hello,my name is Swaroop
-
类变量与对象变量
类的变量是共享的,-----他们可以被属于该类的所有实例访问。该类变量只拥有一个副本,当任何一个对象对类变量做出改变时,发生的变动将在其他所有实例中都会得到体现。对象变量由类的每一个独立的对象或实例所拥有。在这种情况下,每个对象都拥有属于他自己字段的副本,也就是说,他不会被共享,也不会以任何方式与其他不同实例中的相同名称的字段产生关联。
# coding=UTF-8
class Robot:
"""表示一个带有名字的机器人"""
# 一个类变量,用来技术机器人的数量
population=0
def __init__(self,name):
"""初始化数据"""
self.name=name
print("Initializing {})".format(self.name)
# 当有人被创建时,机器人将会增加人口数量
Robot.population+=1
def die(self):
"""我挂了"""
print("{} is being destroyed!".format(self.name)
Robot.population-=1
if Robot.population==0:
print("{} was the last one.".format(self.name)
else:
print("There are still {:d} robots working.".format(Robot.population))
def say_hi(self):
"""来自机器人的诚挚问候
没问题,你做得到的"""
print("Greetings,my master call me {}.".format(self.name))
@classmothod
def how_many():
"""打印当前的人口数量"""
print(" We have {:d} robots.".format(cls.population))
droid1=Robot.("R2-D2")
droid1.say_hi()
Robot.how_many()
droid2=Robot.("C-3PO")
droid2.say_hi()
Robot.how_many()
print('\nRobots can do some work here.\n')
print("Robots have finished their work. So let's destroy them.")
droid1.die()
droid2.die()
Robot.how_many()
输出结果:
(Initializing R2-D2)
Greetings, my masters call me R2-D2.
We have 1 robots.
(Initializing C-3PO)
Greetings, my masters call me C-3PO.
We have 2 robots.
Robots can do some work here.
Robots have finished their work. So let's destroy them.
R2-D2 is being destroyed!
There are still 1 robots working.
C-3PO is being destroyed!
C-3PO was the last one.
We have 0 robots.
- 继承
面向对象编程的一大优点是对代码的重用,重用的一张实现方法就是通过继承机制。
# coding=UTF-8
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()
输出结果:
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Swaroop)
(Initialized Student: Swaroop)
Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
Name:"Swaroop" Age:"25" Marks: "75"