一、类的属性、方法
'''
#类的所有属性
vars(类实例)
'''
class Person(object):
def __init__(self, name):
self.name = name
def get_name(self):
return self.name
if __name__ == '__main__':
one_person = Person('张三')
'''
#是否有属性
hasattr(one_person, "name")
#删除属性
delattr(one_person, "name")
#得到属性值
getattr(one_person, "name")
'''
print(one_person.name)
print(one_person.get_name())
#类的属性
print(vars(one_person))
二、类的私有属性、方法
在属性/方法前面加上’__‘表示为私有属性/方法,但python只是改了属性/方法的名称,改为了’_类名__属性/方法名’
'''
把方法变得和属性一样的使用方法:
@property : 得到该方法的返回结果,不能传参
@函数名.setter : 执行函数内容,函数名对应函数必须被@property装饰,
'''
class Person(object):
def __init__(self, name):
self.__name = name
# 访问器 - getter方法
@property
def get_name(self):
return self.__name
# 修改器 - setter方法
@get_name.setter
def set_name(self, name):
self.__name = name
def __get(self):
return self.__name
if __name__ == '__main__':
one_person = Person('张三')
print(one_person.get_name)
one_person.set_name = '李四'
print(one_person._Person__name)
print(one_person._Person__get())
三、限制属性
class Person(object):
'''
__slots__为限制属性,定义其他属性会报错
'''
__slots__ = ['name','age']
def __init__(self, name):
self.name = name
self.age = 18
# self.gender = 'male'
if __name__ == '__main__':
one_person = Person('张三')
print(one_person.name)
四、静态方法
'''
静态方法:相当于类里的普通函数
用@staticmethod装饰
'''
class Person(object):
def __init__(self):
pass
@staticmethod
def show(name):
return name
if __name__ == '__main__':
print(Person.show('张三'))
五、类方法
'''
类方法:返回类的实例
用@classmethod装饰
'''
class Person(object):
def __init__(self,name):
self.name = name
@classmethod
def show(cls):
'''
cls:表示类对象
'''
return cls('张三')
if __name__ == '__main__':
print(Person.show().name)
六、继承
子类会继承父类的属性和方法
class Person(object):
def __init__(self,name):
self.name = name
def swimming(self):
return '游泳'
class Student(Person):
def __init__(self, name,age):
super().__init__(name)
self.age = age
def play(self):
return '玩'
if __name__ == '__main__':
one_student = Student('张三',18)
print(one_student.swimming())
print(one_student.play())
多继承
'''
当一个子类有多个直接父类时,该子类会继承得到所有父类的方法,如果其中有多个父类包含同名方法时,排在前面的父类中的方法会“遮蔽”后面父类中的方法。
'''
class A(object):
def __init__(self,num):
self.B = num + 1
class B(A):
def __init__(self,num):
super().__init__(num)
self.A = num
class C():
def __init__(self,num):
self.B = num
class D(B,C):
def __init__(self, num):
B.__init__(self, num)
C.__init__(self, num)
if __name__ == '__main__':
'''
多继承涉及到类的遍历顺序
python2 --> 深度优先
python3 --> 广度优先
'''
#D类的搜索顺序
print(D.__mro__)
a = D(1)
print(vars(a))
七、多态
子类可以重写父类的方法
class Person(object):
def __init__(self,name):
self.name = name
def play(self):
return '一个人在玩'
class Student(Person):
def __init__(self, name,age):
super().__init__(name)
self.age = age
def play(self):
return '一个学生在玩'
if __name__ == '__main__':
one_student = Student('张三',18)
print(one_student.play())
八、抽象类
import abc #利用abc模块实现抽象类
class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
pass
@abc.abstractmethod #定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass
class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法')
def write(self):
print('文本数据的读取方法')
t=Txt()
t.read()
print(t.all_type)