类的高级语法
类的属性
lass Role:
hp = 0 #类属性
def __init__(self, hp):#self.hp 成员属性
self.hp = hp
print(Role.hp)
role = Role(100)
print(role.hp)
类方法、静态方法、实例方法
class Student:
def read(self):
print('read')
@staticmethod
def introduce():
print('static method')
@classmethod
def class_info(cls):
print(cls.__name__)
# student = Student()
# student.read() #实例方法调用
# Student.introduce() #静态方法调用
Student.class_info() #类方法调用
对于类:
1.类可以直接访问类属性
2.类不可以直接访问实例方法,必须通过实例化之后的对象来访问实例方法
3.类不可以访问对象特有的属性(比如:def __init__中定义的属性)
4.类可以直接访问类方法
5.类可以直接访问静态方法
如果对象中的属性跟类中的属性相同,改变对象中的属性值,不会影响类中的属性值
对于对象:
1.对象可以直接访问类的属性(实例化过程中,类已经将属性赋给对象)
2.对象可以直接访问自己私有的属性,类的内部。
3.对象可以直接访问类方法
4.对象可以直接访问静态方法
5.对象可以直接访问实例方法
Python的动态特性
动态的添加类属性:
class AI:
__slots__ = ('hp','mp','move') #限制python的动态性
def move(self,speed):
print('以',speed,'的速度移动')
ai = AI()
ai.hp = 100
ai.mp = 1000
print(ai.mp)
print(ai.hp)
# ai.attack = 1000
# print(ai.attack)
AI.count = 10000
print(AI.count)
import types
ai.move = types.MethodType(move , ai)
ai.move(200)
动态的添加类方法、静态方法
class Book:
pass
@staticmethod
def static_method():
print('this is static method')
@classmethod
def cls_info(cls):
print(cls.__mro__)
Book.static_fun = static_method
Book.class_fun = cls_info
Book.static_fun()
Book.class_fun()
动态的删除属性、方法
import types
class AI(object):
def __init__(self):
pass
def run(self):
pass
@staticmethod
def introduce():
pass
@classmethod
def class_info(cls):
pass
#定义类方法
@classmethod
def attack(cls):
print('attack')
#定义静态方法
@staticmethod
def dead():
print('dead')
def move(self,speed):
print('move', speed)
a1 = AI()
a1.move = types.MethodType(move,a1)
AI.attack = attack
AI.attack()
AI.dead = dead
AI.dead()
del a1.move
del AI.attack
del AI.dead
#只能删除动态添加的实例方法
#del a1.run #报错
#可以删除在类中的静态方法和类方法
del AI.introduce
del AI.class_info