面向对象-类

类的使用

类的概念

类是定义同一类所有对象的变量和方法的蓝图或原型

类里的预定义方法

__init__()  '构造器'方法
    任何所需的特定操作,都需要程序员实现__init__(),覆盖他的默认行为。
    在实例化一个对象时,实例对象作为第一个参数(self)被传进去,并且会自动执行这个方法。
进行属性的初始化。
    **注:学过c++的都知道this指针,这里可以把self称为this**
__new__()   '构造器'方法
    继承自object的新式类才有__new__
    与__inti__()相比,__new__()方法更像一个真正的构造器,这是因为__new__()必须
返回一个合法的实例
    __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
    __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,
可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
    __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上
可以完成一些其它初始化的动作,__init__不需要返回值
    若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行
class A(object):
    pass

class B(A):
    def __init__(self):
        print "init"

    def __new__(cls, *args, **kwargs):
        print "new %s" % cls
        return object.__new__(A, *args, **kwargs)

b = B()
print type(b)

输出:
new <class '__main__.B'>
<class '__main__.A'>
__str__()   返回对象的字符串表达式
    在我们编写一个新的Python类的时候,总是在最开始位置写一个初始化方法__init__,
以便初始化对象,然后会写一个__str__方法,方面我们调试程序。
    class Person(object):
        def __init__(self, name, gender):
        self.name = name
        self.gender = gender
        def __str__(self):
            return '(Person: %s, %s)' % (self.name, self.gender)

    s = Person('Bob', 'male')
    print s

    输出:
    (Person: Bob, male)
__del__()   '解构器'方法
        python中是自动管理内存的,管理内存的机制是通过引用计数进行管理。
    当一个对象被创建出来的时候,引用计数为1,当该对象被其他变量或者对象
    引用是,引用计数会+1。
    当对象引用被删除时,引用计数会-1。
    当对象计数为0 时,就会执行__del__()方法,系统会在合适的时候将所占内存释放。
        >>> class new(object):
        ...     def __init__(self):
        ...         print 'v'
        ...     def __del__(self):
        ...        print 'x'
        ...
        >>> n1 = new()
        v
        >>> n2 = n1
        >>> del n2
        >>> del n1
        x

定义一个类

类:新式类和经典类,新式类必须继承至少一个父类。(尽可能的使用新式类)
class 类名():  
    内容
class people():
        def __init__(self,name,age):
            self.name = name
            self.age = age

        def prt(self):
            print self.name

    pe = people('tom',19)
    pe.prt()

输出:
tom

类的属性(更改,添加)

更改 :更改这个类的某个属性
添加 ;只能给这个类的对象添加一个属相,其他的类对象都没有这个属相
  class people(object):
        def __init__(self,name,age):
            self.name = name
            self.age = age

        def prt(self):
            print self.name

pe = people('tom',19)
print pe.name
pe.sex = 'man'   #给pe对象添加一个性别属性
print pe.sex

pr = people('jack',18)
print pr.name
#print pr.sex
#当执行上一个语句时出现属性错误:AttributeError: people instance has no attribute 'sex'

输出:
tom
man
jack

私有化

类中变量,属性,函数的私有化
私有变量 私有函数 都只能在类中使用
如果需要在类外使用:(在子类中一样使用)
对象.类名_变量名

class bank(object):
    bankName = u'建设银行'   #类共公开变量
    __boss = u'兟'          #类私有变量

    def __init__(self, a, b):
        self.user = a
        self.money = b
        self.__passwd = 'abc'

    def printUser(self):   #打印类的属性
        print self.user

    def printBankName(self):  #打印类公开变量
        print self.bankName

    def printBoss(self):     #打印类私有变量
        print self.__boss

    def __sBankName(self):    #私有函数打印公有变量
        print self.bankName

    def __sBoss(self):       #私有函数打印私有变量
        print self.__boss

ban = bank('tom',18)

ban.printUser()
ban.printBankName()
ban.printBoss()
ban._bank__sBankName()
ban._bank__sBoss()
print ban._bank__boss   #打印私有变量

输出:
tom
建设银行
兟
建设银行 tom
兟
兟

如何在子类中访问父类中的私有变量和私有函数
如果类的继承忘了可以看看下面的继承

class bank(object):
    bankName = u'建设银行'   #类共公开变量
    __boss = u'兟'          #类私有变量

    def __init__(self, a, b):
        self.user = a
        self.money = b
        self.__passwd = 'abc'
    def bankUser(self):
        print self.user

    def __sBankName(self):  # 私有函数打印公有变量
        print self.bankName

class addMoeny(bank):
    def __init__(self,a,b):
        super(addMoeny,self).__init__(a,b)

    def printBank(self):
        print self._bank__boss      #访问父类 私有变量
        print self._bank__passwd    #访问父类的私有属性

        bank.bankUser(self)

        # bank.__Bankname(self)   #如何访问父类私有方法

ad = addMoeny('lxshen',100)
ad.printBank()  

输出:
兟
abc
建设银行

@classmethod 和@statmethod 的区别

继承和多继承

继承描述了继承的属性如何‘遗传’给派生类,一个子类可以继承它的基类的任何属性,不管是数据属性还是方法。

class people(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def prt(self):
        print self.name
class man(people):
    def __init__(self,name,age,sex):
        people.__init__(self,name,age)
        '''
        重写__init__不会自动调用基类的__init__
        可以用上面的方法执行父类的__init__
        也可以:
            super(man,self).__init__(name,age)
            用super的漂亮之处在于,你不需要明确给出任何基类名字。
        这就意味着如果更改了类继承关系,只需要该一行代码(class本身)
        而不必在大量代码中去查找所有被修改的那个类的名字。 
        '''
        self.sex = sex

    def printSex(self):
        print self.sex

n = man('lxshen','18','man')
print n.sex   #访问父类的属性
n.prt()      #访问父类方法
n.printSex()  #访问自身方法

输出:
man
lxshen
man

重写父类对象函数

重新写了父类方法,是因为父类方法功能不满足自身类的需求。所以需要重写
    class bank(object):
    def __init__(self, a, b):
        self.user = a
        self.money = b
    def printUser(self):   #打印类的属性
        print self.user

class addMoeny(bank):
    def __init__(self,a,b):
        bank.__init__(self,a,b)

    def printUser(self):
        bank.printUser(self)    #保留父类中的函数部分功能,如果没有这一行,就是完全重写父类方法
        print u'重写printUser'


am = addMoeny('jack',19)
am.printUser()

输出:
jack
重写printUser
   面向对象是每种语言的重中之中,今天把所学的知识点整理了一下,发现还有一些零碎东西没有掌握,
在整理的过程中也巩固了知识。可能还有一些东西没整理到位,如果发现错误希望大家指出来。
也希望自己以后越学越扎实吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值