面向对象

和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)

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

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

posted on 2017-07-31 14:50  行走在云端的愚公  阅读(101)  评论(0编辑  收藏  举报