self
Python 中的 self 相当于 C++ 中的指针以及 Java 与 C# 中的 this 指针。
类
我们通过使用 class 语句与这个类的名称来创建一个新类。在它之后是一个缩进的语句块,代表这个类的主体。通过采用类的名称后跟一对括号的方法,给这个类创建一个对象。
class Person:
pass
p = Person()
print(p)
运行结果:
结果说明在 Person 类的 __main__ 模块中有一个实例。本例还会打印出计算机内存中存储你的对象的地址。
方法
类与对象一如函数那般都可以带有方法(Method),唯一的不同在于还有一个
self 变量。
class Person:
def say_hi(self):
print("hi")
p = Person()
p.say_hi()
Person().say_hi()
运行结果:
注意到 say_hi 这一方法不需要参数,但是依旧在函数定义中拥有 self 变量。
__init__ 方法
__init__ 方法会在类的对象被实例化(Instantiated)时立即运行。这一方法可以对任何你想进行操作的目标对象进行初始化(Initialization)操作。
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()
运行结果:
类似C++中的
构造函数。
类变量与对象变量
数据部分——也就是字段——只不过是绑定(Bound)到类与对象的命名空间(Namespace) 的普通变量。这就代表着这些名称仅在这些类与对象所存在的上下文中有效。这就是它们被称作“命名空间”的原因。字段(Filed)有两种类型——类变量与对象变量,它们根据究竟是类还是对象拥有这些变量来进行分类。
类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。该类变量只有一个副本,当任何一个对象对类变量作出改变时,发生的变动将在其它所有实例中都会得到体现。
对象变量(Object variable)由类的每一个独立的对象或实例所拥有。
'''
类变量是共享的,可以被属于该类的所有实例访问
类变量只有一个副本,当任何一个对象对类变量作出改变时,
发生的改变将在其它所有实例中都得到体现
'''
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(self.population))
def say_hi(self):
print("Greetings, my masters call me {}".format(self.name))
@classmethod
def how_many(cls):
print("We have {:d} robots.".format(cls.population))
droid1 = Robot("R2-D2")
droid1.say_hi()
Robot.how_many()
droid2 = Robot("C-3P0")
droid2.say_hi()
Robot.how_many()
droid1.die()
droid2.die()
Robot.how_many()
运行结果:
与C++/Java区别:
所有类成员(包括数据成员)都是公开的,并且 Python 中所有的方法都是虚拟的 (Vireual)。
继承
'''
基类的__init__方法是通过self变量被显式调用的,因此可以初始化对象的基类部分
由于在子类中定义__init__方法,Python不会自动调用基类的构造函数,必须显式调用
相反,如果没有在子类中定义__init__方法,Python将会自动调用基类的构造函数
【注意】
当使用SchoolMember类的tell方法时,可以将Teacher或Student的实例看作是SchoolMember的实例
'''
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. S", 40, 30000)
s = Student("S", 25, 75)
# 打印一行空白行
print()
members = [t, s]
for member in members:
member.tell()
运行结果: