面向对象编程
封装、继承、多态
-
封装:提高程序安全性
- 将数据(属性)和行为(方法)包装到类中。在方法内部对属性进行操作,在类的外部调用方法。无需关心方法内部的具体实现细节,从而隔离代码复杂度
- 在Python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,属性定义增加两个"_"
-
继承:提高代码的复用性
-
多态:提高程序的可扩展性和可维护性
类的定义
class Student:
#暂时不知道写什么,可以写pass
pass
类名规范
首字母大写
类的组成
class Student:
name = '李白' # 类属性
age = 18
# 对象初始化,初始化方法。 方法可以重载吗
def __init__(self, age):
self.age = age # 属性初始化
# 实例方法。类中叫方法,类之外叫函数
def eat(self):
print("学生吃饭。。")
# 静态方法,静态方法不能写self
@staticmethod
def study():
print("学生学习")
@classmethod
def cm(cls):
print("这是类方法")
pass
print(id(Student))
print(type(Student)) # <class 'type'>
print(Student) # <class '__main__.Student'>
类属性
静态方法
实例方法
类方法
初始化方法
对象的创建
实例名=类()
创建对象,执行init方法
stu = Student(18)
print(stu)
#方法和属性的调用
stu.eat()
Student.eat(stu)
stu.study()
stu.cm()
print(stu.name, stu.age)
动态绑定属性和方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(self.name, "在吃饭")
pass
stu1 = Student("李白", 19)
stu2 = Student("杜甫", 20)
# 绑定属性
stu1.gender = "男"
print(id(stu1), stu1.name, stu1.age, stu1.gender)
stu1.eat()
# AttributeError: 'Student' object has no attribute 'gender'
# print(id(stu2), stu2.name, stu2.age, stu2.gender)
print(id(stu2), stu2.name, stu2.age)
stu2.eat()
def show():
print("定义在类之外的函数")
pass
# 绑定方法
stu1.show = show
stu1.show()
类的封装
class Student:
def __init__(self, name, age):
# __属性名 :私有属性 不能直接对象.属性,进行访问,需要提供对外的方法
self.__name = name
self.__age = age
def show(self):
print(self.__name, self.__age)
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
stu1 = Student("李白", 19)
stu2 = Student("杜甫", 20)
stu1.show() # 李白 19
stu2.show() # 杜甫 20
# AttributeError: 'Student' object has no attribute 'name'
# print(stu1.name)
print(stu1.get_name()) # 李白
stu1.set_name("李白2")
print(stu1.get_name()) # 李白2
print(dir(stu1))
print(stu1._Student__name) # 李白2
python有没有类似java的,访问修饰符?
没有。
属性有私有属性,方法有吗?
有,私有属性、私有方法,都使用两个"_",例:__name
def __test(self):
pass
类的继承及方法重写
python可以多继承
基本语法
class 类名(父类1,父类2,父类3…):
pass
# Python中的类默认继承object。可不写
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name, self.age)
pass
class Student(Person):
def __init__(self, name, age, stu_no):
super().__init__(name, age)
self.stu_no = stu_no
def info(self):
super().info() # 调用父类方法
print(self.stu_no, self.name, "是一个学生")
class Teacher(Person):
def __init__(self, name, age, thr_no):
super().__init__(name, age)
self.thr_no = thr_no
def info(self):
# 重写父类的方法
print(self.thr_no, self.name, "是一个老师")
# 多继承
class StuTeacher(Student, Teacher):
pass
stu = Student("小明", 18, 12318)
teacher = Teacher("李阳", 58, 12318)
stu.info()
teacher.info()
#多继承,多个父类中有相同方法,属性怎么办
super()
object类
object是所有类的父类
dir函数
class Student:
def __init__(self):
pass
def __str__(self):
return "重写对象的str方法,类似java对象中的toString方法"
pass
stu = Student()
print(stu) # <__main__.Student object at 0x00000131FDA30E08>
# 重写str方法
# 对象的描述函数
print(dir(stu))
for item in dir(stu):
print(item)
重写__str__方法
类似java中的重写toString()方法
多态
python方法的形参,没有明确数据类型,python有多态吗?
静态语言与动态语言多态区别
java是静态语言
python是动态语言
特殊属性
特殊方法
_new_()与_init_()
new函数在init函数之前执行,这两个函数可以理解为java中的构造函数