day13-面向对象2
01-内置类属性
- 内置类属性:python中每个类都拥有内置的类属性
__name__
__doc__
__dict__
__module__
__bases__
class Cat:
"""说明文档:猫类"""
number = 0def __init__(self,name= '', color = ''):
self.name = name
self.color = colordef run(self):
print('%s在跑'%self.name)@staticmethod
def shout():
print('喵')@classmethod
def get_number(cls):
print('猫的数量:%s'% cls.number)if __name__ == '__main__':
cat1 = Cat('小花','white')"""
1.__name__获取类的名字(字符串)
"""
print(Cat.__name__)"""
2.类.__doc__ 获取类的说明文档
"""
print(Cat.__doc__)"""
3.类.__dict__获取类中所有的类属性和对应的值,以键值对的形式存到字典里
对象.__dict__ 将对象的属性和对应的值,转换成字典的元素(常用,记住)
"""
print(Cat.__dict__)
print(cat1.__dict__)"""
4.类.__module__获取当前类所在的模块的名字
"""
print(Cat.__module__)"""
5.__bases__ 获取当前类的父类
"""
print(Cat.__bases__)
02-私有化
python中类中的属性和方法的私有化:直接在属性名或者方法名前加_ _(命名以'_ _'开头)
属性或者方法私有:在外部不能直接使用,可以在类的内部使用
class Person:
"""人类"""
def __init__(self,name= '',age=0):
self.name = name
self.__age = age
def show_age(self):
print('%d'%(self.__age - 10))
self.__run()
# 私有的对象方法,只能在类的内部调用
def __run(self):
print('%s在跑'% self.name)# 私有的类方法
@classmethod
def __get_number(cls):
print(cls.__number)import random
class Student:
def __init__(self,name):
self.name = name
self.study_id = ''
def creat_id(self):
return 'py1805' + str(random.randint(1,50)).rjust(3,'0')def creat(self,name):
stu = Student(name)
stu.study_id = self.__creat_id()
return stuif __name__ == '__main__':
p1 = Person('张三',30)
p1.name = '李四'
# p1.__age = 28
# print(p1.name,p1.__age)
p1.show_age()
03-getter和setter
- 【day13-面向对象2】属性假的私有化:声明对象属性的时候,在属性名前面加一个'_',来告诉别人这个属性不可以直接使用。要getter和setter来获取属性的值和修改属性的值
- 1.getter:获取属性的值
@property
def 属性名(去掉下划线)(self):
return 返回值
如果在获取对象的某个属性前需要再干点别的事情,就给属性添加getter
- 2.setter:给属性赋值
一个属性必须要有getter才能添加setter
@属性名(去掉下划线).setter
def 属性名去掉下划线(self,变量名):
给带下划线的属性赋值
如果在给对象的某个属性赋值前需要再干点儿别的事情,就给属性添加setter
class Student:
"""学生类"""
def __init__(self):
# 声明属性的时候前面加一个'_'是为了告诉别人这个属性不能直接使用
self._name = ''
self._score = 0
self._age = 0#给属性_name添加getter
@property
def name(self):
return self._name
#给属性_name添加setter
@name.setter
def name(self,value):
self._name = value@property
def score(self):
return self._score
@score.setter
def score(self,value):
self._score = value@property
def age(self):
return self._age
@age.setter
def age(self,value):
self._age = valueif __name__ == '__main__':
stu1 = Student()
# 不添加getter和setter
# stu1._name = '张三'
# print(stu1._name)# 添加了getter和setter
stu1.name = '李四'
print(stu1.name)
04-类的继承 子类:继承者
父类(超类):被继承者
- 1.怎么继承
python中类是可以继承的,并且支持多继承
class 类名(父类)
'''类的说明文档'''
属性
方法
说明:python中所有的类默认继承python的基类:object
- 2.能继承哪些内容
继承:直接拥有父类的属性和方法(继承后父类的属性和方法还是存在的)
a.对象的属性和方法、类的字段和类方法、静态方法都可以继承(私有的继承无意义---不能继承)
b. _slots _的值不会被继承
c.getter和setter会被继承
class Person:
"""人类"""
__slots__ = ('name','age','sex','__length','_face')
def __init__(self):
self.name=''
self.age = 0
self.sex = '男'
self.__length = 0
self._face = 0def eat(self):
print('%s在吃饭'% self.name)# 类字段
number = 61@classmethod
def get_number(cls):
print('人类数量:%d'% cls.number)@staticmethod
def hurt_earth():
print('人类破坏地球')class Student(Person):
"""学生类"""
passif __name__ == '__main__':
stu = Student()
stu.name = '小明'
print(stu.name,stu.age,stu.sex)stu.eat()Student.number
Student.get_number()
Student.hurt_earth()
推荐阅读
- 数组常用方法一
- jQuery插件
- iOS面试题--基础
- 口红选得好,对象不愁找......
- java静态代理模式
- Python-类和对象
- JavaScript|JavaScript: BOM对象 和 DOM 对象的增删改查
- JavaScript|JavaScript — call()和apply()、Date对象、Math、包装类、字符串的方法
- 1-Java基础知识
- 14--Python|14--Python 面向对象进阶