1、封装
python中的类可以封装:属性,方法。
1.1属性的封装:
将属性私有化,并且定义共有方法set和get。
#当我们对于一个类进行属性封装时,需要定义私有属性:
class Student:
def __init__(self,name,age):
self.__name = name
self.__age = age
#像这样定义私有化属性后,外界就无法通过普通的'.'来访问
s = Studnet('zs',12)
s.name # 报错
s.__name # 报错
# 这时我们需要get和set方法来实现获取和赋值
# get获取私有属性的值
def get_name(self,name):
return self.__name
def get_name(self,age):
return self.__age
name = s.get_name()
age = s.get_age()
print(name,age)
# set设置私有属性的值
def set_name(self,name):
self.__name = name
def set_age(self,age):
self.__age =age
# 调用类中的这个方法,就可以赋值
s.set_name(name)
s.set_age(age)
但是问题来了,如果我只是定义了私有变量那有什么用呢 ?实际上,我们可以利用理由变量来进行一些限制操作
# 假设我们在__init__中定义了一个self.__login=False 来判断是否登录
# 那么这个get方法就可以限制未登录就不可以拿到name的值
def get_name(self):
if self.__login:
return self.__name
else
return "未登陆"
# 这个set方法就可以增加输入条件
def set_name(self,name):
if len(name) > 6:
self.__name = name
else:
return "姓名不符合要求"
可是,对象存在动态赋值这么一说,即使这个类没有name属性,也可以通过s.name = ‘…’进行赋值,我们不希望对象被动态赋值,每一个对象只能对私有属性赋值,那么就需要__slots__
,
# 在__init__之前定义__slots__
__slots__ = ['__name','__age']
def __init__(self,name,age):
....
这个__slots__是一个列表,写上私有属性,这样每个对象只能用这些属性了,不能动态赋值
私有化的作用:
1、隐藏了属性,私有属性只能在类中使用
2、对私有属性的取值和赋值起到了一定的限制作用
3、通过set方法限制赋值,get方法限制取值
1.2 @property与@属性名.setter装饰器
@property装饰器:装饰get函数,可以直接利用 s.name 拿到对象中私有属性的值
@属性名.setter装饰器(属性名是get函数的函数名): 装饰set函数,可直接s.name=‘zhaowu’,设置对象中私有属性的值
@property
def name(self):
return self.__name
@name.setter
def name(self,name):
self.name = name
虽说两个函数的名称一样,但是加了装饰器之后,被@property装饰的是get函数,@属性名.setter装饰的就是set函数。而且在没有__slots__的情况下,动态赋值时的参数名就不能与@property装饰的函数名相同,否则会进行@property的赋值操作
2、继承
简单来说就是子类继承父类,父类中有共有的一些属性和方法,比如说:老师类,学生类,都有吃,喝,玩等方法,都有姓名,年龄等属性,我们可以写一个父类,父类中写入吃喝玩,姓名年龄。这样每个子类只要继承父类就可以用有这些属性和方法。而他的好处就是能够使代码更加简练,减少冗余,提高可读性等等。python3 默认继承 object
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
return self.name+'正在吃'
def play(self):
return self.name+'正在玩'
class Student(Person): # 继承父类
pass
class Teacher(Person): # 继承父类
pass
s = Student('zs',12)
print(s.eat()) # zs正在吃
print(s.play()) # zs正在玩
需要注意的是,每个子类继承的是父类非私有化属性,共有属性可以访问,私有属性就不可以访问
2.1 @classmethod 类方法
通常,我们无法通过 类名.方法名的形式使用类中的方法,一般是 对象.方法名 去使用,但是我们可以通过@classmethod 去装饰这个方法,这样,就可以直接通过 类名.方法名 去使用
class Person:
name = '小明'
age = 23
@classmethod
def eat(cls): # cls 是类名
return cls.name+'正在吃'
print(Student.eat()) # 小明正在吃
2.2 @staticmethod 静态方法
静态方法不依赖cls,也不依赖self,他只是一个方法,通过 类名.属性 访问类属性
class Person:
name = '小明'
age = 23
@staticmethod # 静态方法不依赖与任何参数
def eat():
return Student.name+'正在吃' # 只能通过类名访问
print(Student.eat()) # 小明正在吃
s = Student()
print(s.eat()) # 也可以使用
类方法与静态方法都可以被对象或类调用,两者也可以相互调用,类方法不能访问对象属性,它只与类打交道,不与对象有关联
3、多态
多态与继承有关系,多态指的是继承时,传过来一个对象,这个对象可以是父类实例化的任何的对象
具体可以参照鸭子模型~