1、类
class Person: # 创建一个新类
pass # 这个类的主体是 一个空的代码块
p = Person() # 采用类名()的方式给这个类创建一个对象
print(p) # 打印结果告诉我们 在Person类的 __main__模块中拥有了一个实例;
# 此外还会打印出计算机内存中存储这个对象的地址
2、__init__方法
class Person:
def __init__(self, name): # name为一个局部变量
self.name=name
def sayhi(self):
print('hi,how are u', self.name)
p = Person('guana')
p.sayhi()
3、类变量 & 对象变量
类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。 该类变量只拥有一个副本,当任何一个对象对类变量作出改变时,发生的变动将在其它所有 实例中都会得到体现。
对象变量(Object variable)由类的每一个独立的对象或实例所拥有。在这种情况下,每个 对象都拥有属于它自己的字段的副本,也就是说,它们不会被共享,也不会以任何方式与其它不同实例中的相同名称的字段产生关联。
'''
1、声明一个类:机器人
2、声明一个类变量,计数机器人的数量
3、定义 init函数,并告知用户已初始化机器人的名称,并注意计数变量的变化
4、定义die函数,注意计数变量的变化
5、sayhi函数
6、计数函数
'''
class Robot:
population = 0
def __init__(self, name):
self.name = name
print('Initialized ', 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 {} robots'.format(Robot.population)) # 这里用{:d}
def say_hi(self):
print('hi,i am {}'.format(self.name))
# classmethod 类方法,@classmethod为装饰器,可将how_many方法标记为类方法
@classmethod
def how_many(cls):
print('we have {:d} robots'.format(cls.population))
r1 = Robot('ET')
r1.say_hi()
Robot.how_many()
r2 = Robot('moka')
r2.say_hi()
r1.die()
Robot.how_many()
r2.die()
Robot.how_many()
'''
打印结果:
Initialized ET
hi,i am ET
we have 1 robots
Initialized moka
hi,i am moka
----------ET is being destroyed----------
there are still 1 robots
we have 1 robots
----------moka is being destroyed----------
moka was the last one
we have 0 robots
'''
4、超类 & 子类
继承关系
'''
1、定义超类,定义初始化函数,tell函数
2、定义子类Teacher,定义子类的初始化函数、子类的tell函数
3、定义子类Student,... ...
4、建立对象
5、调用所有tell
'''
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=' ') # end=' '使得此print在打印的末尾不换行,从而使salary、marks等能够和name、age输出在同一行
class Teacher(SchoolMember): # 在定义子类时,需要在子类类名后跟一个包含超类名称的元组
def __init__(self, name, age, salary):
# 因为我们在Teacher和Student子类中定义了__init__方法,Python不会自动调用基类SchoolMember的构造函数,你必须自己显式地调用它。
SchoolMember.__init__(self, name, age) # 调用超类的方法时,这里要传入self和其余变量
self.salary = salary
print('Initialized Teacher: {}'.format(self.name))
def tell(self): # 同上,调用超类的方法时,这里要传入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('yang', 30, 9000)
s = Student('zhang', 20, 99)
member = [t, s] # 这里的列表中项目类型为对象,而非字符串,所以不能't','s'
for m in member: # for...in 能在任何队列中工作。总体来说可以包含任何类型对象的队列!
m.tell()
print('Done')
'''
打印结果:
Initialized SchoolMember: yang
Initialized Teacher: yang
Initialized SchoolMember: zhang
Initialized Student: zhang
name: yang, age: 30, salary: 9000
name: zhang, age: 20, marks: 99
Done
'''