- 类和实例的一些内置属性
- __init__:初始化对象的内部特征值
- __dict__:可以得到类的属性列表和实例的属性列表
- self.class获取到当前类的名字
Student.__dict__ # 类属性列表
student = Student()
student.__dict__ # 实例的属性列表
- 定义实例变量
- 在init方法里,添加实例变量
def __init__(self, name, age):
self.name = name
self.age = age
- 定义实例方法
- 需要加上默认参数self,self可以更改为其他名字,常用self
def add(self):
pass
- 定义类方法
在方法上面加上装饰器@classmethod,cls可以更改为其他名字,常用cls
@classmethod
def plus_sum(cls):
pass
- 定义静态方法(不建议常用,可用类方法代替)
- 在方法上加上装饰器@staticmethod,不用传入默认的参数
@staticmethod
def static_sum():
pass
- 类和实例都可以调用静态方法
- 继承:python可以多继承
面向对象高级编程
- 给已创建好的一个类绑定一个新的属性和方法
from types import MethodType
class Student(object):
def __init__(self, name):
self.name = name
s1 = Student('Tom')
s2 = Student('Lili')
s1.score = 10
print(s1.score) # 10
# print(s2.score) # Error 给一个实例绑定属性,对其他实例不起作用
def set_age(self, age):
self.age = age
s1.set_age = MethodType(set_age, s1)
s1.set_age(20)
print(s1.age) # 20
# print(s2.age) # Error 给一个实例绑定方法,对其他实例不起作用
Student.set_age = set_age
s1.set_age(30)
print(s1.age) # 30
s2.set_age(40)
print(s2.age) # 40
- 限制实例只能添加特定的属性,使用slots
==仅对当前实例起作用,对集成的子类不起作用==
class Student(object):
# 限制只能有这2个属性
__slots__ = ('name', 'age')
def __init__(self, name, age):
self.name = name
self.age = age
s1 = Student('Tom', 10)
# s1.score = 10 # Error
# AttributeError: 'Student' object has no attribute 'score'
- 使用@property来创建属性已经控制读写
class Student(object):
'''
score可读写,average只可读
'''
@property
def score(self):
return self._score
@score.setter
def score(self, value):
self._score = value
@property
def average(self):
return self._score / 2
s1 = Student()
s1.score = 100
print(s1.score) # 100
print(s1.average)
# s1.average = 30 # Error AttributeError: can't set attribute