8.6 面向对象编程基础

类和对象

简单的说,类是对象的蓝图和模板,而对象是类的实例。这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的东西。在面向对象编程的世界中,一切皆为对象,对象都有属性和行为,每个对象都是独一无二的,而且对象一定属于某个类(型)。当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定义出一个叫做“类”的东西。

函数的写法

"""
标识    函数名字 ():
有冒号就要缩进一个tab
在Python中所有的函数都有返回值,如果你没有给予return则默认返回出None,如果你给予了,则返回你给予的值
""""
def     funcName():
.     ....
      return ....
"""
标识     类名 () :
        有冒号就要缩进一个tab
"""
class    className(object):
        ........

"""
1.导入库, import 库名
2. for  循环,如果计数的情况则使用
            开始 结束 不长
    range的区间是一个前闭后开.
    range(start,end,[step])
3. 格式化输出
3.1  %-->%(),%d后接整型,%f后接浮点,%s后接字符串.
3.2  {}-->format(),它可以直接传入任何类型,然后格式化输出.

4.print 控制台(terminal)打印
4.1  end 以什么方式结尾,默认以换行符"\n"
4.2  flush 刷新缓冲区.
"""

"""
类中的函数可以有自己的参数
当你想共享这个参数的时候,那么就打上"self"的印记.
"""

class A(object):
       def __init__(self,a):
             self.a = a
       def B(self,b):
             self.b = b
             print(b)
       def C(self):
             print(self.b)


J = A(1000)
J.B(10)
J.C()

定义类

# object 不是一个参数
"""
定义类只有两步:
1. 使用标识符class ClassName(object):
2. 重写__init__函数,但是需要记住,一定要打上一个"self"的标记
因为后面会学到继承,当在继承的时候可能就会有函数名相撞的情况.
或者说,类中会含有多个变量,多个函数,那么就需要使用"self"手段去区分.
3. 类的传参是在__init__函数中的.需要注意的是,如果你的参数可能被多个函数都使用,那么
你才在__init__函数中去定义参数
"""
class Student(object):
       def __init__(self,name):
               # 多个打印用","进行分隔.
               print(name)


Student(100)

# 在Python2中这个object一定要写,但是在Python3中可写可不写(默认就继承了object).
#
class Student(object):
      # __init__是一个特殊方法用于在创建对象时进行初始化操作
      # 通过这个方法我们可以为学生对象绑定name和age两个属性
      def __init__(self, name, age):
            self.name = name
            self.age = age

      def study(self, course_name):
            print('%s正在学习%s.' % (self.name, course_name))

      # PEP 8要求标识符的名字用全小写多个单词用下划线连接
      # 但是很多程序员和公司更倾向于使用驼峰命名法(驼峰标识)
      def watch_av(self):
             if self.age < 18:
                 print('%s只能观看《熊出没》.' % self.name)
             else:
                  print('%s正在观看岛国爱情动作片.' % self.name
# 实例
student = Student()

说明:写在类中的函数,我们通常称之为(对象的)方法,这些方法就是对象可以接收的消息

# 学类会有些累.
class Student(object):
      """
第二步初始化,初始化自己.
当你的类有一些公用变量的时候,你就可以初始化
初始化中经常放入公有的变量.
      """
      def __init__(self,name):
             """
             在类中,一切的变量和函数都要印记(self)
              """
              self.name = name
       def def1(self,num):
              self.num = num
              print(self.num)
              print(self.name)
       def def2(self):
              print(self.num)
              print(self.name)


if __name__ == "__main__":
    # 实例,类名带括号“Student()”,直接运行初始化函数
     student = Student('杜苗苗')
     student.def1(100)
     student.def2()

创建和使用对象

当我们定义好一个类之后,可以通过下面的方式来创建对象并给对象发消息。

def main():
      # 创建学生对象并指定姓名和年龄
      stu1 = Student('骆昊', 38)
       # 给对象发study消息
      stu1.study('Python程序设计')
       # 给对象发watch_av消息
        stu1.watch_av()
        stu2 = Student('王大锤', 15)
        stu2.study('思想品德')
        stu2.watch_av()


if __name__ == '__main__':
       main()

访问可见性问题

对于上面的代码,有C++、Java、C#等编程经验的程序员可能会问,我们给Student对象绑定的nameage属性到底具有怎样的访问权限(也称为可见性)。因为在很多面向对象编程语言中,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象能够接受的消息。在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头,下面的代码可以验证这一点。

# 私有变量,变量名前面加"__"
# 如果非要使用私有变量,那么可以使用dir(class())去查看它真正的名字.
# 私有变量/函数,在类内部可以直接调用.
# 如果你想体现一个变量/函数特别重要你可以使用"_"

class  Test:

        def __init__(self, foo):
              self.__foo = foo

        def __bar(self):
               print(self.__foo)
               print('__bar')


def main():
         test = Test('hello')
         # AttributeError: 'Test' object has no attribute '__bar'
         test.__bar()
         # AttributeError: 'Test' object has no attribute '__foo'
         print(test.__foo)


if __name__ == "__main__":
       main()

但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来“妨碍”对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们,下面的代码就可以验证这一点。之所以这样设定,可以用这样一句名言加以解释,就是“We are all consenting adults here”。因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。

class Test:

        def __init__(self, foo):

              self.__foo = foo

        def __bar(self):
               print(self.__foo)
               print('__bar')


def main():
       test = Test('hello')
       test._Test__bar()
       print(test._Test__foo)


if __name__ == "__main__":
     main()

 

猜你喜欢

转载自www.cnblogs.com/WANGRUNZE/p/11311407.html
8.6