Python笔记5(面向对象)

  • 类和实例的一些内置属性
  1. __init__:初始化对象的内部特征值
  2. __dict__:可以得到类的属性列表和实例的属性列表
  3. self.class获取到当前类的名字
Student.__dict__ # 类属性列表
student = Student()
student.__dict__ # 实例的属性列表
  • 定义实例变量
  1. init方法里,添加实例变量
def __init__(self, name, age):
    self.name = name
    self.age = age
  • 定义实例方法
  1. 需要加上默认参数self,self可以更改为其他名字,常用self
def add(self):
    pass
  • 定义类方法
    在方法上面加上装饰器@classmethod,cls可以更改为其他名字,常用cls
@classmethod
def plus_sum(cls):
    pass
  • 定义静态方法(不建议常用,可用类方法代替)
  1. 在方法上加上装饰器@staticmethod,不用传入默认的参数
@staticmethod
def static_sum():
    pass
  1. 类和实例都可以调用静态方法
  • 继承: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

你可能感兴趣的:(Python笔记5(面向对象))