'''
Python3面向对象
'''
'''
类定义: 用来描述具有相同的属性和方法的对象的集合。
语法:
class ClassName:
<statement-1>
.
.
.
<statement-N>
1、类有一个名为 __init__() 的特殊方法(构造方法),该方法在类实例化时会自动调用
__init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上
2、类方法:使用 def 关键字来定义一个方法
类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。
类对象:
类对象支持两种操作:属性引用和实例化。
属性引用的标准语法:obj.name。
'''
class Myclass:
num = 100
def __init__(self):
print('调用构造方法')
def out_str(self):
return 'This is Myclass'
x = Myclass()
print('Myclass类中属性num为:',x.num)
print('Myclass类中方法out_str输出结果为:',x.out_str())
class AddAction:
def __init__(self,a,b):
self.a = a
self.b = b
def add(self):
return self.a+self.b
obj = AddAction(5,6)
print(obj.add())
class TestClass:
def prt(self):
print(self)
print(self.__class__)
t = TestClass()
t.prt()
'''
继承
子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
父类BaseClassName(实例中的基类名)必须与子类(派生类)定义在一个作用域内。
'''
class ParentClass:
name = ""
age = 0
def __init__(self,n,a):
self.name = n
self.age = a
def introduce(self):
print('我是%s,今年%d岁。' %(self.name,self.age))
class pupil(ParentClass):
school = ''
def __init__(self,n,a,s):
ParentClass.__init__(self,n,a)
self.school = s
def introduce(self):
print('我是%s,今年%d岁,在%s上学' % (self.name, self.age,self.school))
p = pupil('kicle', 10, '实验小学')
p.introduce()
'''
多继承
多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,
python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
'''
class p1:
def __init__(self):
print('p1构造方法')
def prt1(self):
print('p1打印方法1')
class p2:
def __init__(self):
print('p2构造方法')
def prt1(self):
print('p2打印方法1')
def prt2(self):
print('p2打印方法2')
class c1(p1,p2):
def __init__(self):
print('c1构造方法')
c = c1()
c.prt1()
c.prt2()
class c2(p2,p1):
def __init__(self):
print('c2构造方法')
c = c2()
c.prt1()
c.prt2()
'''
方法重写
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
super() 函数是用于调用父类(超类)的一个方法。
'''
class Pa1:
def myAction(self):
print('父类中的方法')
class Ch1(Pa1):
def myAction(self):
print('子类中的方法')
c = Ch1()
c.myAction()
super(Ch1,c).myAction()
'''
类属性和方法
1、私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。
在类内部的方法中使用时 self.__private_attrs。
2、类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。
在类内部使用时 self.__private_methods。外部不能调用私有方法
'''
class Test:
__name = '陈丽'
age = 30
def __test(self):
print('%s今天%d岁了'%(self.__name,self.age))
def test1(self):
print('%s今天%d岁了'%(self.__name,self.age))
t = Test()
print(t.age)
t.test1()
'''
类的专有方法:
__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__call__: 函数调用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方
'''