zoukankan      html  css  js  c++  java
  • 面向对象

    面向对象

    和java一样,OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
    不同之处是python中方法也是对象,这和js有点类似

    类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响;

    class Student(object):
        
    
    • 通过关键字class来声明
    • class之后是类名
    • ()内object是继承的类,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类;和java中的Object类似
    • 创建对象方式:
    s = Student()
    
    • 和js类似,可以自由给一个对象绑定属性
    #绑定name属性
    s.name="sfdsfd"
    #打印出属性值
    print(s.name)
    
    • 定义构造方法__init___,和java中的构造器类似,第一个参数必须是self,调用时,不需要传入,python解释器会自动传入对象本身,需要注意的是,如果定义了__init___,创建实例时,传参必须和__init___方法的参数一致
    class Student(object):
    
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
    • 该类中的方法,要访问类的数据,声明时第一个参数要是self,调用时,不需要声明,这个方法是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据
    #定义Student类
    class Student(object):
        
        def __init__(self, name, score):
            self.name = name
            self.score = score
    
        def print_score(self):
            print('%s: %s' % (self.name, self.score))
    #调用
    s=Student('Tom', 90);
    s.print_score()
    

    声明私有变量

    以__开头,且不能以__结尾来定义这个成员变量为私有变量,外部通过 变量名.属性名 的方式不能直接访问

    class Student(object):
    
        def __init__(self, name, score):
            self.__name=name
            self.__score=score
    
    s = Student('Tom', 90)
    print(s.__name)
    

    运行后会报错

    Traceback (most recent call last):
      File "/Users/demo/workspace/pythonDemo/src/Demo.py", line 8, in <module>
        print(s.__name)
    AttributeError: 'Student' object has no attribute '__name'
    

    注意:这种定义私有变量的方式只是和解释器的一种约定,实际上,不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量,我们要遵守这种约定,不要试图使用_Student__name的方式来访问这种变量,不同版本的Python解释器可能会把__name改成不同的变量名,

    多态和继承

    和java的思想一样,主要目的是实现代码的重用,遵循对扩展开放,对修改封闭
    值得注意的地方是,python是动态语言,方法调用时,不需要明确传参的具体类型,主要能够保证方法内的逻辑,也就是这个参数有某个方法即可,java是强制性语言,必须严格类型。

    常用对象的方法

    #返回123的类型
    type(123)
    #判断fn是否是函数
    type(fn)==types.FunctionType
    #
    type(abs)==types.BuiltinFunctionType
    #判断是否是lambda表达式
    type(lambda x: x)==types.LambdaType
    #
    type((x for x in range(10)))==types.GeneratorType
    #判断s是否是Student类型
    isinstance(s, Student)
    #输出一个字符串的所有属性,返回值为一个包含字符串的list
    dir('ABC')
    # 判断s是否有属性'_Student__name'吗?
    hasattr(s, '_Student__name') 
    # 设置属性
    setattr(s, 'age', 19)
    # 获取属性,如果没有返回默认值-1
    getattr(s, 'age', -1)
    

    类的属性和对象的属性区分

    类属性是公开的,对象的属性如果和类属性重名,会覆盖类属性

  • 相关阅读:
    题型:系统可靠性
    计算机基础——网络存储
    传输层——TCP的流量控制服务
    传输层——UDP和TCP的对比
    配置——VLAN
    项目管理——PERT图
    从“派生类不能访问基类对象的protected成员”开始讨论各类成员的“可见性”
    cin.clear()和cin.sync
    华为编程大赛——路径查找
    华为编程大赛——求表达式的值
  • 原文地址:https://www.cnblogs.com/warking/p/7263074.html
Copyright © 2011-2022 走看看