Python3面向对象

#!usr/bin/python
#coding=UTF-8
'''
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())

#输出
#调用构造方法
#Myclass类中属性num为: 100
#Myclass类中方法out_str输出结果为: This is Myclass

#__init__()方法在类实例化时会自动调用
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())    #输出 11

#self代表类的实例,而非类

class TestClass:
    def prt(self):
        print(self)
        print(self.__class__)
t = TestClass()
t.prt()

#输出
#<__main__.TestClass object at 0x0000023FDD1B9B80>
#<class '__main__.TestClass'>

#由此可见:self 代表的是类的实例,代表当前对象的地址;而self.__class__则指向类


'''
继承
    子类(派生类 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))

#pupil继承ParentClass
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()   #输出 我是kicle,今年10岁,在实验小学上学

'''
多继承
    多继承的类定义形如下例:
        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()
#输出
#c1构造方法
#p1打印方法1
#p2打印方法2

class c2(p2,p1):
    def __init__(self):
        print('c2构造方法')
c = c2()
c.prt1()
c.prt2()
#输出
#c2构造方法
#p2打印方法1
#p2打印方法2

#由此可见,在子类中未定义的方法,如果调用方法,则从左到右查找父类中的方法,有就执行此父类方法。
'''
方法重写
    如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
    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)    #输出 30
t.test1()       #输出 陈丽今天30岁了
#print(t.__name)
#报错
#Traceback (most recent call last):
#  File "E:\Program Files\pythonProject\python\19class_file.py", line 190, in <module>
#    print(t.__name)
#AttributeError: 'Test' object has no attribute '__name'


#t.__test()
#报错
#Traceback (most recent call last):
#  File "E:\Program Files\pythonProject\python\19class_file.py", line 196, in <module>
#    t.__test()
#AttributeError: 'Test' object has no attribute '__test'

'''
类的专有方法:
    __init__ : 构造函数,在生成对象时调用
    __del__ : 析构函数,释放对象时使用
    __call__: 函数调用
    __repr__ : 打印,转换
    __setitem__ : 按照索引赋值
    __getitem__: 按照索引获取值
    __len__: 获得长度
    __cmp__: 比较运算
    __add__: 加运算
    __sub__: 减运算
    __mul__: 乘运算
    __truediv__: 除运算
    __mod__: 求余运算
    __pow__: 乘方
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风之梦丽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值