复习python面向对象
- 1.面向对象定义
- 2.类特殊方法
- 3.封装
- property装饰器
- 4.继承
- 多重继承
- 5.多态
- 6.属性和方法
1.面向对象定义
在讲面向对象之前,先来看看面向过程。
面向过程:将一个功能分解成一个一个小的步骤,通过完成一个个步骤来完成一个程序。
面向对象:关注的是对象,而不关注过程。它的编程思想是将所有的功能统一保存到对应的对象中,易于维护和复用。
class Person():# 在类中可以定义变量和函数name = 'swk' # 公共属性,所有实例都可以访问def say_hello(self):print('你好!%s' % self.name)p1 = Person()
p2 = Person()p1.name = '猪八戒'
# 调用方法,对象.方法名()
p1.say_hello()
2.类特殊方法
特殊方法都以__开头,__结尾的方法。
特征:特殊方法不需要我们自己调用。
学习特殊方法:1.特殊方法什么时候调用 2.特殊方法有什么作用。
class Person:def __init__(self, name, age):self.name = nameself.age = age# 当我们打印一个对象时,实际上打印的是对象中的特殊方法__str__返回值 def __str__(self):return 'Person [name = %s, age = %s]'%(self.name, self.age)# __repr__作用:指对象在’交互模式‘中直接输出的效果def __repr__(self):return 'hello'# object.__lt__(self, other) 小于# object.__le__(self, other) 小于等于# object.__eq__(self, other) 等于# object.__ne__(self, other) 不等于# object.__gt__(self, other) 大于# object.__ge__(self, other) 大于等于def __gt__(self, other):return self.age > other.agedef say_hello(self):print('大家好!我是%s' % self.name)# del是一个特殊方法,它会在对象被垃圾回收前调用def __del__(self):print('Person()对象被删除了~',self)p1 = Person('孙悟空', 20)
p2 = Person('孙悟空', 15)
print(p1.name)
p1.say_hello()
print(p1)
print(repr(p1))
print(p1 > p2)
print(p2 > p1)p = Person('孙悟空', 20)
p = None # 将a设置为None,此时没有任何变量要引用,它就变成垃圾
input('回车键退出...')
3.封装
封装指的是隐藏对象中一些不希望被外部所访问的属性或对象。
如何隐藏一个对象中的属性?
- 将对象的属性名,修改为一个外部不知道的名字
如何获取(修改)对象中的属性? - 需要提供一个getter和setter方法使外部可以访问到属性
- getter获取对象中的指定属性(get_属性名)
- setter设置对象中的指定属性(set_属性名)
使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全性。
class Person:def __init__(self, name):self.__name = namedef get_name(self):return self.__namedef set_name(self, name):self.__name = namep = Person('mimi')
# print(p.__name) # __开头的属性是隐藏属性,无法通过对象访问
# print(p._Person__name) # 这样也可以访问到
print(p.get_name())
# 使用__开头的属性,实际上依然可以在外部访问,一般不用
# 一般我们会将一些私有属性以_开头,告诉别人不希望修改
class person:def __init__(self, name):self._name = namedef get_name(self):return self._namedef set_name(self, name):self._name = name
p = person('mimi')
print(p._name)
property装饰器
property装饰器,用来将一个get方法,转换为对象的属性。
class Person:def __init__(self, name):self._name = name# property装饰器,用来将一个get方法,转换为对象的属性# 添加为property装饰器以后,我们就可以像调用属性一样使用get方法@propertydef name(self):print('get方法执行了~')return self._name# setter方法的装饰器:@属性名.setter@name.setterdef name(self, name):self._name = namep = Person('nunu')
p.name = '孙悟空'
print(p.name)
4.继承
通过继承我们可以使一个类获取到其他类中的属性和方法。
class Animal:def run(self):print('动物会跑~')def sleep(self):print('动物睡觉~')# 通过继承我们可以使一个类获取到其他类中的属性和方法
class Dog(Animal):def bark(self):print('汪汪汪~')def run(self):print('狗跑~')d = Dog()
d.bark()r = isinstance(d, Dog)
print(r)
# 调用方法时,
# 会优先去当前对象中寻找,如果有则直接调用,
# 如果没有,则去父类中寻找,即就近原则
class A(object):def test(self):print('AAA')class B(A):def test(self):print('bbb')class C(B):def test(self):print('ccc')c = C()
c.test()
super()可以用来获取当前的父类
super().__init__(name)
多重继承
多重继承,就是我们可以为一个类同时指定多个父类
5.多态
多态:一个对象可以以不同的形态去呈现。
class A:def __init__(self, name):self._name = name@propertydef name(self):return self._name@name.setterdef name(self, name):self._name = nameclass B:def __init__(self, name):self._name = namedef __len__(self):return 10@propertydef name(self):return self._name@name.setterdef name(self, name):self._name = namea = A('孙悟空')
b = B('租八戒')def say_hello(obj):print('你好%s'%obj.name)say_hello(a)
say_hello(b)
面向对象三大特征:
封装:确保对象中的数据安全
继承:保证了对象的可扩展性
多态:保证了程序的灵活性
6.属性和方法
1.类属性
类属性,直接在类中定义的属性是类属性
类属性可以通过类或类对象的实例访问到
但是类属性只能通过类对象来修改,无法通过实例对象修改
2.实例属性
实例属性,通过实例对象添加的属性属于实例属性
3.类方法
在类内部使用@classmethod 来修饰的方法属于类方法。
4.实例方法
在类中定义,以self为第一个参数的方法都是实例方法。
类方法和实例方法区别:实例方法的第一个参数是self,而类方法的第一个参数是cls。
5.静态方法
在类中使用@staticmethod来修饰的方法属于静态方法。
静态方法不需要指定任何的默认参数,静态方法可以通过类和实例去调用。
class A(object):# 类属性count = 0def __init__(self):# 实例属性self.name = '孙悟空'# 实例方法def test(self):print('test方法~~~', self)# 类方法@classmethoddef test_2(cls):print('test_2方法,它是一个类方法', cls)print(cls.count)# 静态方法@staticmethoddef test_3():print('test_3执行了~')a = A()
# 实例属性,通过实例对象添加的属性属于实例属性
# a.count = 10
A.count = 100
print(a.count)
print(A.count)
# 实例属性只能通过实例对象来访问和修改,类对象无法访问修改
# print(a.name)
# print(A.name) # 报错
A.test_2()A.test_3()
a.test_3()
最近在找工作,希望能尽快找到自己满意的工作。也希望每个看我文章的人有好的未来。加油!加油!加油!!!