面向对象 :详解
- 类(class) :用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也成为了方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是咋类的其他成员方法之外声明的。
- 继承:极易个派生类继承基类的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数
- 对象:通过类定义的数据结果实例。对象包括两个数据成员(类变量和实例变量)和方法。
- 简单的一个实例:
-
class Test: #类定义 i = 123 #直接在类中放属性和属性值 def fn(name): #print("输入的名字是:", name) return 'hello,wolrd' x = Test() #实例化该类 #访问该类的属性 print("Test这个类中i的值为:", x.i) #Test这个类中i的值为: 123 #x.fn(cassie) 这样调用类中的函数会报错? #访问该类的方法 print(x.fn())
-
-
_init_() ---构造方法(init前后分别为_ _两个下划线,否则会报错),由于很多类都倾向于将对象创建为有初始状态的,所以类可能会定义一个_int_()
-
def _init_(self): self.data = []
-
- 错误提示TypeError: Complex() takes no arguments-----不接收任何参数
- 类的方法:
- 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数:
class People:
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
def __str__(self):
return self.__weight
#定义构造方法
def __init__(self, n, a, w): #self为实例化本身,类似于js的this
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说:我 %d 岁。"%(self.name, self.age))
'''
("%s 说:我 %d 岁。")此时的%s和%d均为参数,行参,需要在后面给他加上实参,需要加%
比如("%a 前面为要传入的参数,后面这个是传入的实参"%(self.name ###此时就是实参))
'''
#实例化
p = People('cassie', 10, 3)
p.speak()
class People:
name = ''
age = 0
sex = 'f'
def __str__(self): #把名字直接展示出来,在直接print实例化对象时
return self.name
def __init__(self, name): #接收参数
self.name = name #修改上面的name属性的值
#print('this is start')
def like_apple(self): #需要调用此函数
if self.sex == 'f':
print('女性爱吃苹果')
elif self.sex == 'n':
print('男性不爱吃苹果')
else:
print('没有性别,无法判断')
print(self.name, self.age)
a = People('cassie') #实例化
a.like_apple() #调用自己写的函数
'''
输出结果为:
女性爱吃苹果
cassie 0
'''
print(a) #因为上面写了__str__这个方法,所以在print时,直接返回了名字
- 继承:
- BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
#定义一个主类
class people:
name = ''
age = 0
def __init__(self):
self.name = name
self.age = age
def speak(self):
print("%s 说:我%d 岁了。"%(self.name, self.age))
#继承实例,在定义一个类来继承主类
class student(people):
grade = ''
def __init__(self,name, age, grade):
people.__init__(self, name,age)
self.grade = grade
#复写父类的方法:
def speak(self):
print("%s 说:我今年%d 岁了,上 %d 年级"%(self.name, self.age, self.grade))
#初始化类
s = student('cassie', 10, 3)
#调用该类的方法
s.speak()
#######输出结果为
cassie说我10岁了,上3年级
- 多继承
- 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,Python 从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
-
class Example(Lei1,Lei2)
#定义一个主类
class People:
name = ''
age = 0
def __init__(self):
self.name = name
self.age = age
def speak(self):
print("%s 说:我%d 岁了。"%(self.name, self.age))
#继承实例,在定义一个类来继承主类
class Student(people):
grade = ''
def __init__(self,name, age, grade):
People.__init__(self, name,age)
self.grade = grade
#复写父类的方法:
def speak(self):
print("%s 说:我今年%d 岁了,上 %d 年级"%(self.name, self.age, self.grade))
#在定义一个父类
class Speaker():
name = ''
language = 'c'
def __init__(self, name, language):
self.name = name
self.language = language
def speak(self):
print("我叫%s ,我说%d 语言"%(self.name, self.language))
#多继承
class More(Speaker,Student):
a = ''
def__init__(self, name, age, grade, language):
Student.__init__(self, name, age, grade)
Speaker.__init__(self, name, language)
test = More('liu', 10, 3, '中文')
test.speak() #因为这两个类中的方法均定义为speak,所以在调用方法时,默认调用前面父类的方法,所以调用的是Speaker这个类中的方法
######输出结果为
我叫刘,我说中文语言
- 方法重写
- 在继承时,父类的方法不满足需求时,可以在子类中重写父类中的方法:
class Parent:
def method(self):
print('调用父类的方法')
class Child(Parent):
def method(self): #此时重写了父类中的method这个方法
print('调用子类的方法')
c = Child()
c.method()
###输出结果为
调用子类的方法
- 类属性与方法:
- 类的私有属性:
- __private_attrs(__weight):两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用方法为:self.__pricate_attrs(self.__weight)
- 类的方法
- 在类的内部,使用def关键字为类定义一个方法,接收的参数第一个参数必须为self(初始化的类本身)
- 类的私有方法
- __method:两个下划线开头,声明该方法只在该类内部使用,还用方法为self.__method
- 类的私有属性:
class Test:
__siyou_variable = '私有变量'
name = '公开变量'
def method(self):
print(self.__siyou_variable) #私有变量
print(self.name) #公开变量
d = Test()
d.method() #初始化类之后,调用类的方法
print(d.name) #直接输出类中的指定属性的属性值
print(d.__siyou_variable) #此时为私有属性,不能直接输出结果,所以会报错
####一次输出结果为
私有变量
公开变量
公开变量
Traceback (most recent call last):
File "test.py", line 16, in <module>
print (d.__siyou_variable) # 报错,实例不能访问私有变量
AttributeError: 'Test' object has no attribute '__siyou_variable'
- 类的专有方法:
- __init__:构造函数,在生成对象是调用
- __del__:析构对象,在释放对象时使用
- __repr__:打印,转换
- __setitem__:按照索引赋值
- __getitem__:按照索引取值
- __len__:获得长度
- __cmp__:比较运算
- __call__:函数运算
- __add__:加运算
- __sub__:减运算
- __mul__:乘运算
- __div__:除运算
- __mod__:求余运算
- __pow__:乘方
- 运算符重载
class Vector: def__init__(self, a, b): self.a = a self.b = b def __str__(self): return 'Vector (%d, %d,)'%(self.a, self.b) def __add__(self): return Vector(self.a + other.a, self.b + other.b) v1 = Vector(2,10) v2 = Vector(5,-2) print(v1 + v2) ##输出结果为 Vector(7,8)