1、类定义
语法格式如下:
class ClassName:
<statement-1>
.
.
.
<statement-N>
类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。
2、基本操作
类对象支持两种操作:属性引用和实例化。
#属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
#类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:
class MyClass:
i = 12345
def f(self):
return 'hello world'
# 实例化类
x = MyClass()
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())
# 以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。
print()
3、__init__函数
# 类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:
# def __init__(self):
# self.data = []
# 类定义了 __init__() 方法,类的实例化操作会自动调用 __init__() 方法。如下实例化类 MyClass,对应的 __init__() 方法就会被调用:
# x = MyClass()
# 当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。例如:
class Complex:
def __init__(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i) # 输出结果:3.0 -4.5
print()
4、self具体含义
# self代表类的实例,而非类
# 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
# 解释器会自动把调用该函数的对象作为第一个参数传递给self
class Test:
def prt(self):
print(self) #<__main__.Test object at 0x000002166A209790>
print(self.__class__) # <class '__main__.Test'>
pass
pass
t = Test()
t.prt()
print()
'''
以上实例执行结果为:
<__main__.Test instance at 0x100771878>
__main__.Test
'''
# 从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
# 证明如下:
class Verification:
def Get_Self_Id(self):
print(id(self))
pass
pass
ver = Verification()
print(id(ver))
ver.Get_Self_Id()
print()
- 注意:self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:
class Test:
def prt(runoob):
print(runoob)
print(runoob.__class__)
t = Test()
t.prt()
以上实例执行结果为:
<__main__.Test instance at 0x100771878>
__main__.Test
5、小结
# 在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
# 类定义
class people:
# 定义基本属性
name = ''
age = 0
# 定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
# 定义构造方法
def __init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" % (self.name, self.age))
# 实例化类
p = people('runoob', 10, 30)
p.speak()
6、案例(对打小游戏)
'''
双人对打小游戏
属性:name,blood
方法:Normal_Attack:一次掉10滴血
Special_Attack:一次掉20滴血
Add_Blood:加血5滴
__str__打印玩家状态
'''
class Person:
def __init__(self, name, blood, energy):
self.m_Name = name
self.m_Blood = blood
self._Energy = energy
self.m_Blood_Bag = 3
pass
def Normal_Attack(self, opponent):
opponent.m_Blood -= 10
self._Energy -= 5
print('{}对{}普攻一下'.format(self.m_Name, opponent.m_Name))
pass
def Special_Attack(self,opponent):
opponent.m_Blood -= 20
self._Energy -= 10
print('{}对{}放大招了'.format(self.m_Name, opponent.m_Name))
pass
def Add_Blood(self):
self.m_Blood += 5
self.m_Blood_Bag -= 1
print('{}吃了个血瓶'.format(self.m_Name))
pass
def __str__(self):
return '{}此时有{}滴血,{}能量'.format(self.m_Name, self.m_Blood, self._Energy)
pass
p1 = Person('勇士', 100, 60)
p2 = Person('憨批易隆平', 100, 60)
print(p1, p2)
p1.Normal_Attack(p2)
print(p2)
p2.Add_Blood()
print(p2)
p2.Special_Attack(p1)
print(p1, p2)