Python学习系列:面向对象高级编程(-)

话说,自从学了Java后,陆陆续续入门了C,Js,Ruby,Python等。在我的思维里,我一直认为精通一门语言,然后入门四五种其他语言就会慢慢的变成一个编程高手了。以致于我花费90%的时间用在学习Java领域的相关东西。10%的时间用在边入门边忘记这四五种语言循环里了。(在此一个无奈。。)

你们说在咱们的岗位上,用的东西通常也就局限于一小块。而我们通常自学的很多的东西,基本是用不到的,学了又忘了。学它不是浪费时间吗?像现在正在学的Python,之前也接触到了,基础的东西也会用,而比较深奥的东西,自学的过程基本不会专研那么深,真的是时间有限。不知道你们是什么感觉,我喜欢学新东西,但是有个不好的心态,就是想用非常短的时间只要会用它就行了。以致于一直处于刚入门的阶段。而对于刚入门的东西,以后不用基本会完全忘掉。感觉自己的态度太差了。就像刷算法一样,有时一天基本就刷一道,还花了1个多小时,慢慢的没有耐心刷了。感觉自己有点追求数量,不追求质量一样。学了非常多,但是呢,那种技术成长了的感觉却没有多少。

就当是发牢骚吧。每当进入一个新类型的公司,接触新的知识,内心都是焦虑的,为什么我不能一天就能进入公司的正常轨道呢?

致自己:多点怀疑的态度吧;多点探索的精神吧;多点求知的欲望吧;多和别人交流吧

牢         骚         完         毕


以前一直听别人说python是一种好用的脚本语言,哦,原来是脚本语言啊,看来也做不了什么高大上东西,这是接触python之前的直观想法。记得之前有公司到我们学校找脚本开发工程师,记得好像要求shell脚本开发,那时连linux都没接触过,不懂他说啥,所以当时我是个麻瓜。

本科的时候接触过C,当时连打字都不会,你让我学C,根本就不懂啊,像指针啊,结构体啊,感觉好高深,C语言结课之后,好几年没接触过C。接着接触了Java,书中的开篇就提到,Java是面向对象编程语言,总结了一大堆面向对象编程的优点,接着说C是面向过程的编程语言,受到了哪些哪些限制。一下子我就对C没啥好印象了。感觉C只能写写简单的函数而已,不像Java,Java中有类的概念,感觉一些东西都依托在类上,而类又可以相互传递,感觉Java好nb的样子,而且大家都说Java好,因此我就随大流了,入了Java坑了。

因为一些工作的需要慢慢也接触了Python,才知道Python虽然是脚本语言,但是它里面也有类的概念,这就涉及到Python的高级编程了。

怎样定义一个类和使用类呢?

那就先来定义一个类,看看Python中的类如何定义的。

class Student(object):

    #这个函数就类似于Java中的构造函数
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def print_score(self):
        print('%s: %s' %(self.name, self.score))

首先强调一点的是,类中的函数,首个参数都是self,self表示类的当前实例的引用,相当于Java中的this。

关于如何实例化,应该使用什么参数,看下面的例子:

stu1 = Student('name1', 99)
stu2 = Student('name2', 100)

发现没有,上面的实例化和Java区别在于:Java需要使用new关键字,而Python中仅仅使用类名。而其中传递的参数是和__init__()对应的,其中self不需要传入参数,会进行隐式赋值的。

访问权限修饰符存在吗?

在Java中,针对于方法,成员变量,类,存在对应的访问权限修饰符:public 、protected、private、默认(就是啥不写)。那Python中有这些东西吗?对不起,没有。那Python中如何控制访问权限呢?这就涉及到Java的命名规则了。以双下划线开头的变量是访问不到的(即private的,其实针对你写的变量,只要变量的开始两个字符是下划线,你都是访问不到的,记住,方法名也是一个变量。访问不到的原因很简单,是Python内部将变量名进行修改了,如果知道修改后的变量名,你还是可以访问到的,需要你遵守Python规范,别胡来。。)。python中认为以双下划线开头,又以双下划线结尾的变量是特殊的,这类变量是python中自带的,当然你可以定义类似的格式,但还是一句话,自觉遵守规范吧。。

class A(object):

    def __init__(self, value1, value2, value3, value4, value5):
        #可以访问到
        self.value1 = value1
        #不可以访问到
        self.___value2 = value2
        #不可以访问到
        self.__value3__ = value3
        #可以访问到
        self._value4 = value4
        #不可以访问到
        self.__value5_ = value5
    #不可以访问到
    def __method1(self):
        print('method1')
    #可以访问到
    def _method2(self):
        print('method2')
    #不可以访问到
    def __method3__(self):
        print('method3')
    #不可以访问到
    def __method4_(self):
        print('method4')

单继承还是多继承?

Python和C++一样,也是支持多继承的。Java是单继承,但Java中有实现接口,这个功能nb。Python实现多继承方法很简单,继承的多个父类使用逗号隔开。

class A1(object):
    def run(self):
        print('run A1')

class A2(object):
    def run(self):
        print('run A2')

#这就是多重继承
class A3(A1, A2):
    def run(self):
        print('run A3')

class B(object):
    def run(self):
        print('run B')

class C(object):
    #这里我想只传递A1的实例或者其子类的,但是python是动态语言,只要a1有对应的方法run,就可以调用成功。这是好还是不好呢?
    def invoke(self, a1):
        a1.run()

c = C()
a1 = A1()
a2 = A2()
A1 a3 = A3()
b = B()
c.invoke(a1)#返回:run A1
c.invoke(a2)#返回 run A2
c.invoke(a3)#返回 run A3
c.invoke(b) # 返回 run B

如何查看一个对象的信息?

目前所见到的三个内嵌的函数用起来感觉还是不错的,包括:type()、isinstance()、dir()。

  • type():判断一个对象的类型,感觉用起来不错

    type('123') #<class 'str'>
    type(123) # <class 'int'>
    type(object) # <class type>
    type([1, 2, 3]) # <class 'list'>
  • isinstance():判断一个对象是否是某个类型的实例

    isinstance('123', str) #True
    isinstance(123, int) #True
    isinstance(False, bool) # True
  • dir():这个比较厉害了,获得一个对象的所有属性和方法。当我们不确定某个对象是否存在某个方法时,直接使用这个函数就可以查到了

    dir([1, 2, 3]) # ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值