面向对象
- 面向对象基本术语
▶类:用来描述具有相同属性和方法的对象的集合。类定义了集合中每个对象共有的属性和方法。对象是类的实例。
▶类变量(属性):类变量在整个实例化的对象中是公用的。类变量定义在类中,且在方法之外。类变量通常不作为实例变量使用。
▶实例变量:定义在方法中的变量,只作用于当前实例的类。
▶数据成员:类变量或者实例变量用于处理类及实例对象的相关数据。
▶方法重写:如果从父类集成的方法不能满足子类的需求,就可以对其进行改写,这个过程称为方法的覆盖(override)。
▶多态(Polymorphism):对不同类的对象使用同样的操作。
▶封装(Encapsulation):对外部世界隐藏对象的工作细节。
▶继承(Inheritance):即一个派生类(derived class) 继承基类(base class) 的字段和方法。继承允许吧一个派生类的对象座位一个基类对象对待,以普通类为基础建立专门的类对象。
▶实例化(Instance):创建一个类的实例、类的具体对象。
▶方法:类中定义的函数。
▶对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。 - 类的使用
class MyClass(object):
i=123
def f(self): #定义类的方法时,第一个参数必须为self,除了self不用传入,其他参数正常传入
return 'hellworld'
use_class=MyClass() #累的实例化,此处得到的user_class变量称为类的具体对象
print('调用类的属性:',user_class.i)
print('调用类的方法:',user_class.f())
执行结果:
调用类的属性:123
调用类的方法:hellworld
-
类的构造方法
def __init__(self): 初始化,在定义类时,若不显示的定义一个__init__()方法,则默认调用一个无参的__init__()方法
一个类中可定义多个构造方法,但实例化类时只实例化最后的构造方法,即后面的构造方法会覆盖前面的构造方法,并且需要根据最后一个构造方法的形式进行实例化。建议一个类只定义一个构造函数。 -
类的访问权限
私有变量(private):变量名以__开头,则只有内部可以访问,外部不能访问,只有通过增加get_attrs才可以获取
私有方法:方法名以__开头,且不能在类外使用class Student(object): def __init__(self,name,score): #构造方法 self.__name=name #私有变量 self.__score=score #私有变量 def info(self): #公共方法 print('学生:%s;分数:%s'%(self.__name,self.__score)) def __foo(self): #私有方法 print('学生:%s;分数:%s'%(self.__name,self.__score)) def get_score(self): #获取私有变量 return self.__score def set_score(self,score): #更改私有变量 self.__score=score stu=Student('xiaomeng',95) stu.info() stu.__foo #报错,私有方法不可外部调用 stu.__score #报错,私有变量不可外部调用 stu.get_score() stu.set_score(0)
-
继承:当定义一个class时,可以从某个现有的class继承,定义新class称为子类(subcalss),二被继承的class称为基类、父类或超类(Base class、Supper class)。
定义:class DerivedClassName(BaseClassName):
statement-1
…
…
statement-N
继承特点:①在继承中,基类的构造方法不会被自动调用,需要在子类的构造方法中专门调用。
②在调用基类的方法是需要加上基类的类名前缀,并带上self参数变量。区别与在类中调用普通函数式不需要带self参数。
③首先查找对应类型的方法,如果在子类中找不到对应的方法,才到基类中逐个查找。
④子类获取父类全部非私有的功能,父类的私有方法不能继承或调用。 -
多态:当子类和父类存在相同的方法是,子类的方法会覆盖父类的方法,在代码运行时总会调用子类的方法。
-
封装:全局作用去榆中其他区域隐藏多余信息的原则。
class Student(object): def __init__(self,name,score): self.name=name self.score=score def info(self): print('学生:%s;分数:%s'%(self.name,self.score)) stu=Student('xiaomeng',95) info(stu)
-
多重继承:一个子类可以继承多个父类,同事获得多个弗雷所有非私有功能。
定义: class DerivedClassName(Base1,Base2,Base3):
statement-1
…
…
statement-N -
获取对象类型方法:type()、isinstance()、dir()
-
类专有方法:
str:直接显示变量调用的不是__str__(),而是__repr__(),两者区别在于__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,所以__repr__()是为了调试服务的。
iter:如果想将类用于for …in循环,就不续实现__iter__()方法。该方法返回一个迭代对象,for循环会不断调用改迭代对象的__next__()方法,活的循环的下一个值,知道遇到StopIteration错误时退出循环。
# -*- coding:utf-8 -*-
class Fib(object):
def __init__(self):
self.a,self.b=0,1 #初始化两个计数器a、b
def __iter__(self):
return self #实例本身就是迭代对象,所以返回自己
def __next__(self):
self.a,self.b=self b,self.a+self.b #计算下一个值
if self.a>100: #退出循环条件
raise StopIteration();
return self.a #返回下一个值
for n in Fib():
print(n)
getitem:Fib实例虽然能够作用于for循环,和list有点像,但是不能像list一样按照下标取出元素,需要实现__getitem__()方法
class Fib(object):
def __getitem__(self,n):
a,b =1,1
for x in range(n):
a,b=b,a+b
return a
fib=Fib()
fib[3]
getattr:当调用一个不存在的属性时,可以通过__getattr__返回一个动态属性,避免报错,默认范围None
class Student(object):
def __init__(self):
self.name='xiaozhi'
def __getattr__(self,sttr):
if attr=='None':
return 0
call:直接对实例进行调用,可以通过callable()函数判断一个对象能否被调用
来源:https://blog.csdn.net/weixin_38223267/article/details/98868929