一、对象补充
对象的属性:通过对象来使用;声明init方法,self.属性名=值
# 类的字段:通过类来使用;类里面函数的外面,属性名=值
init方法
a、用来初始化对象的属性
b、通过类创建对象的时候,系统自动调用init方法(创建的时候要保证init每个参数都要有值)
注意:如果函数的参数是对象(列表、字典、类的对象),传参的时候传的是地址,如果函数中需要对象的内容进行修改,传参的时候传对象的拷贝(如果是列表可以切片)
def func1(list1):
list1.append(10)
print(list1)
def func2(list2):
list2.append(20)
print(list2)
list11 = [1, 2, 3, 4]
func1(list11)
func2(list11)
func1(list11[:])
func2(list11[:])
[1, 2, 3, 4, 10]
[1, 2, 3, 4, 10, 20]
[1, 2, 3, 4, 10, 20, 10]
[1, 2, 3, 4, 10, 20, 20]
二、内置类函数
class Color:
"""颜色类"""
red = (255, 0 , 0)
内置类属性:python中每个类都拥有内置的类属性
1__name__
2__doc__
3__dict__
4__module__
5__bases__
注意:当我们通过_slots_ 去约束对象的属性后,对象_dict_ 属性不能使用。如果父类设置了_slots_ ,子类对象也不能使用_dict_。
class Animal:
"""动物类"""
pass
class Cat(Animal):
"""说明文档:猫类"""
number = 0
def __init__(self, name='', color=''):
self.name = name
self.color = color
def run(self):
print('%s在跑' % self.name)
@staticmethod
def shout():
print('喵~')
@classmethod
def get_number(cls):
print('猫的数量:%d' % cls.number)
if __name__ == '__main__':
cat1 = Cat('小花', 'white')
1.类._name_
获取类的名字(字符串)
print(Cat.__name__)
Cat
2.类._doc_
获取类的说明文档
print(Cat.__doc__)
print(list.__doc__)
说明文档:猫类
3.类. _dict_ 获取类中所有的类属性和对应的值,以键值对的形式存到字典中
对象._dict_ 将对象的属性和对应的值,转换成字典的元素(常用,记住)
print(Cat.__dict__)
print(cat1.__dict__)
{'__module__': '__main__', '__doc__': '说明文档:猫类', 'number': 0, '__init__': , 'run': , 'shout': , 'get_number': }
{'name': '小花', 'color': 'white'}
4.类._module_: 获取当前类所在的模块的名字
print(Cat.__module__)
print(Color.__module__)
__main__
__main__
5.类._bases_: 获取当前类的父类
print(Cat.__bases__)
(,)
三、私有化
python中类中的属性和方法的私有化,直接在属性名或方法名前加_(命名的以'_'开头,两个下划线),属性或方法私有:在外部不能直接使用,可以在类的内部使用.
class Person:
# 私有的类字段
__number = 23
def __init__(self, name='', age=9):
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)
四、getter和setter
属性假的私有化:声明对象属性的时候,在属性名前面加一个'_',来告诉别人这个属性不可以直接使用。
要通过getter和setter来获取属性的值和修改属性的值
1、getter:获取属性的值
@property
def 属性名(去掉下划线)(self)
return 返回值(self._属性名)
如果在获取对象的某个属性前需要再干点儿别的事情,就给属性添加setter
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
if __name__ == '__main__':
stu1 = Student()
stu1.score = 98
print(stu1.score)
98
五、继承
子类:继承者
父类(超类):被继承者
1、怎么继承
Python中类是可以继承的,并且支持多继承
class类名(父类):
'''类的说明文档'''
属性
方法
说明:python中所有的类默认继承Python的基类:object
2、能继承那些内容
继承:直接拥有父类的属性和方法(继承后父类的属性和方法还是存在的)
a、对象的属性和方法、类和字段和类方法、静态方法都可以继承(私有的继承无意义--不能调用)
b、_slots_的值不会被继承
c、getter和setter会被继承
class Person:
"""人类"""
def __init__(self):
self.name = ''
self.age = 0
self.sex = '男'
self.__length = 0
self._face = 0
def eat(self):
print('%s在吃饭' % self.name)
# 类字段
number = 213
@classmethod
def get_number(cls):
print('数量%s' % cls.number)
@staticmethod
def harm():
print('harm moon')
class Student(Person):
"""学生类"""
pass
if __name__ == '__main__':
stu = Student()
stu.name = '小伟'
print(stu.name)
stu.eat()
print(stu.__dict__)
stu.get_number()
stu.harm()
小伟
小伟在吃饭
{'name': '小伟', 'age': 0, 'sex': '男', '_Person__length': 0, '_face': 0}
数量213
harm moon