1. 类和对象
类是抽象的概念,对象是实例化的概念
类的定义:
class 类名: 等价于
class 类名(object): 等价于 (派生其他基类,多个用‘,’隔开)
class 类名():
类的实例化对象:直接赋值
对象名=类名()
通过对象名。方法来引用类的成员
注:类名规范,首字母大写,在声明类时后面
2. 成员
访问类型:公有数据成员与私有数据成员:
定义:以_ _(两个下划线)开头且不以_ _(两个下划线)结束的成员表示为私有成员,否则为公有成员
一般只能在类内使用(在类外不能直接被访问,Python对私有成员提供严格的访问保护机制),类外访问:
对象名 . _类名_ _私有成员(也就是调用对象的公有成员方法来访问),例 :
class Test:
public=13 #公有成员属性
__private=12 #私有成员属性
print('内部访问',__private)
test=Test()
print('外部访问',test._Test__private) #外部访问(不建议使用的)
print('公有成员直接访问',Test.public)
_xxx:以一个下划线开头,保护成员。
__xxx:以两个下划线开头,表示为私有成员。
__xxx__:前后各两个下划线,定义为特殊成员(例:构造器等)。
" . "表示成员访问运算符,可以用来命名空间,模块或对象中的成员。
数据成员:
对象数据成员:
定义:对象数据成员主要在构造方法(__init__() )中定义,定义和在实例方法中访问以self作为前缀
类数据成员:
类的数据成员不在任何成员方法中,是类所有对象共享的,不属于任何一个对象
class MemberTest:
classValue=2 #类的数据成员
def __init__(self): #构造器(特殊成员,特殊方法)
self.value=1 #对象的成员
testMembet=MemberTest() #实例化(创建对象)
MemberTest.classValue #类的数据成员可以通过类或对象名访问
print(testMembet.classValue)
print(testMembet.value) #对象成员只能通过对象名访问
注:程序中或类的外部,对象的数据成员只能通过对象名访问; 类的数据成员可以通过类名或对象名访问
方法成员:动作
方法成员和数据成员差不多,分为有公有方法、私有方法、静态方法、类方法。公有方法和私有方法(公有成员与私有成员)一般指属于对象的实例方法,其中私有方法名字以两个下划线’__‘开始。
普通实例方法,必须以self作为第一个参数
@classmethod:声明类方法(修饰器)
@staticmethod:声明静态方法(静态方法可以没有参数)
class Root:
__value=1
def show(self):
print('普通方法',self.__value+1) #私有成员属性在普通实例方法中的访问必须self.
@classmethod
def classShow(cls):
print('类方法',cls.__value+2) #私有成员属性在类方法中的访问必须self.
@staticmethod
def staticSow():
print('静态方法')
root=Root
root.show(root) #普通实例方法访问实例成员时可以通过对象
root.classShow()
root.staticSow()
属性
属性是一种特殊形式的成员方法,综合了公开数据成员和成员方法(python中支持更加全面的保护机制,设置属性为只读,无法修改,删除,增加成员)
语法1:
class 类名:
@property #方法转为属性
def 方法名(self): #方法名,该名称最后将作为创建的属性名
方法体 #实现的具体功能,通常以
return
语句结束,用于返回计算结果
语法2:
class 类名:
def 方法1():
def 方法2():
……
属性名=property(方法1,方法2,……)
且定义的属性不能修改,不能删除 ,例:
class AttributeTest:
@property #修饰器,定义属性(也就是方法转为属性),且定义的属性不能修改,不能删除
def test(self):
return self.value
def __init__(self,values):
self.value=values
att=AttributeTest(4)
print(att.test) #属性名,不是方法
del att.test #不能删除
att.value(att)
将属性设置为可读,可修改,可删除的属性,例:
class Test:
def __init__(self,values):
self.value=values #注意下这里是公有成员value
def get(self): #读取公有成员
return self.value
def set(self,v): #修改公有成员
self.value=v
def dell(self):
del self.value
vl=property(get,set,dell) #定义属性(可读可写),指定相应读写方法
test=Test(3)
print(test.vl)
test.vl=5 #修改属性值
print(test.vl)
del test.vl #删除属性
print(test.vl)
3. 继承
继承是一种设计复用和代码复用的机制(也就是减少重用性)。
在继承关系中,已有的,设计好的类称为父类或基类,新设计的类称为子类或派生类(派生类可以继承父类的公有成员,不能继承私有成员)
如果需要在派生类调用基类的方法,使用内置函数super(),或通过基类名 . 方法名()的方式实现
例:
class Person(object): # object是已经设计好的类即:父类或基类,可简写成class Person:
def __init__(self):
self.setName='哈哈'
self.setAge='18'
def getName(self):
return self.setName
class Sun(Person): # Person是新建立的类:派生类(子类)
def __init__(self):
super().__init__() # 通过super()调用,不能有self参数
#Person.__init__(self) # 通过父类(基类)调用父类方法,self参数不能省略
self.id=1
def show(self):
print(self.id,self.setName,self.setAge)
sun=Sun()
sun.show()
4. 特殊方法
前面介绍:__xxx__前后各两个下划线,定义为特殊成员(即特殊方法)
__init__:构造方法(创建对象时,最先执行的方法,可用来初始化)
__del__:析构方法(创建对象,最后执行的方法,可用来释放对象,进行清理工作)