1、封装
2、继承
3、多态
例如,人类就是封装,人类继承自动物类,孩子继承父母特征,分为单一继承,多继承;
多态,继承自动物类的人类,猫类的操作 吃 不同
类是创建实例的模板,实例是一个个的具体的对象,每一个实例都拥有各自的属性,而方法便是与实例绑定的函数,在函数中可以访问实例的数据
class Student():
def __init__(self,name,age):
self.n = name #属性name
self.a = age #属性age
def say_hello(self): #其中的一个方法
print("{}'s age is {}".format(self.n,self.a))
info = Student('Chen Fei',25)
info.say_hello()
__init__(self)方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会自动调用该方法,而我们所指定的一些属性,例如name,age等都可以绑定到self,也就是实例本身,需要注意的是,当我在创建类的时候,如果写了__init__()时,在构建一个实例时,就必须传入对应的参数。
info就是Student的实例化,初始化。
那么self到底是什么呢?
class MyClass:
"""This is a class"""
x = 123
def foo(self):
print(id(self))
return self
w = MyClass()
print(w.x)
print(w.foo())
print(id(w))
结果:
123
4521763896
<__main__.MyClass object at 0x10d84a438>
4521763896
内存地址是一样的,由此可知:
self代表实例本身,指向的并不是类,而是指向的实例,这里相当于 w
每一个实例都有自己的属性,那么该如何访问这些数据呢?
class People():
def __init__(self,name,age):
self.n = name
self.a = age
def what_age(self):
print("{}'s age is {}".format(self.n,self.a))
def what_people(self):
if self.a <= 30:
print("{} is teenager".format(self.n))
elif self.a > 30:
print("{} is old".format(self.n))
info = People('Chen Fei',35)
info.what_people()
就是让内部设置的属性不被外部所能访问,也就是将变量设置成一个私有变量,方法是将变量改为以__双下划线开头的变量,例如: __gender
示例:
class Student():
def __init__(self,name,gender):
self.name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self,gender):
if isinstance(gender,str) and (gender == 'male' or gender == 'female'):
self.__gender = gender
else:
raise ValueError('Error gender')
w = Student('Chen', 'male')
print(w.get_gender())
if w.get_gender() != 'male':
print('faild-1')
else:
w.set_gender('female')
print(w.get_gender())
if w.get_gender() != 'female':
print('faild-2')
else:
print('success')
__gender这是一个私有变量,不能直接通过w.__gender来获取,但是我们可以定义一个方法来获取,也可以定一个方法来修改变量。