首页 技术 正文
技术 2022年11月19日
0 收藏 705 点赞 2,907 浏览 2361 个字

一、概述

  老生常谈了,万物皆对象。Python作为一门面向对象的语言,也不例外

  直接看一个简单的类定义和实例化类的示例:

class Student:
passstu = Student()

  // pass表示什么也不做

二、类和实例

  这在Java等OOP语言中也很常见,这里不再赘述:类是抽象的模板,实例是具体的对象

  定义类通过class关键字,后面跟类名,并在类名后通过括号指定从哪个类继承而来。object是所有类的父类:

class Student(object):
pass

  实例化则通过类名加括号的形式:

stu = Student()

  对于需要绑定的属性,可以通过特殊的__init__方法:(Java中通常叫构造器),类属性则直接在类中定义即可。

    其中__init__第一个参数必须是self,用来表示实例本身;后面再在方法内部进行参数绑定:

class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score

  相应的实例化的时候也需要进行参数绑定:

stu = Student("张三", 90)

  在Python中也可以在类中定义方法类达到封装数据的效果:

    这里只需要在类中定义方法时传入self,其他和普通函数一样。外部调用时不用传入self,其他也和普通函数一样

class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score def print_score(self):
print("你的成绩是:%s" % self.score)stu = Student("张三", 90)
stu.print_score()

    静态方法使用注解即可:

@staticmethod
def m():
print("静态方法")

  // 也就是Java中的static了

三、访问控制

  前面的代码中__init__方法虽然进行了属性绑定,但就像Java中通过Public定义成员变量一样的,外部是可以为所欲为的直接操作变量的

  为了达到Java的private效果,我们通过之前介绍的__双下划线即可实现:

class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score def print_score(self):
print("你的成绩是:%s" % self.__score) @staticmethod
def m():
print("静态方法")stu = Student("张三", 90)
stu.print_score()
# 使用__后无法直接访问
# print(stu.name)

  这样只能在内部通过__访问,而外部只能通过相关的公开方法操作了,达到了类似Java中的private的效果

  对应的get set形式如下:

class Student(object):
def __init__(self, name, gender):
self.name = name
self.__gender = gender
def get_gender(self):
return self.__gender
def set_gender(self, gender):
self.__gender = gender

  // 后续补充摸索get set的真正写法和快速生成法

四、继承和多态

  1.继承

    通过继承,可以得到父类的全部功能。当然,子类也具备继承中常见的覆盖override

class Person(object):
def __init__(self, name, age):
self.__name = name
self.age = age def run(self):
print("奔跑吧!")class Man(Person):
passman = Man("江北", 18)
man.run()

  // 更多继承相关,待补充

  2.多态

    多态的概念也不再赘述,这里介绍一下Python中判断类型的方法:

>>> isinstance(a, list)

    给出一个多态的示例:

class Person(object):    def run(self):
print("奔跑吧!")class Man(Person):
def run(self):
print("奔跑吧!男生")class Woman(Person):
def run(self):
print("奔跑吧!女生")def my_run(p):
p.run()my_run(Man())
my_run(Woman())

  当然,从代码可以看到动态语言并不像静态语言(例如Java)一样有严格的继承体系和严格的多态。

  实际上这里的my_run()方法只要接收一个有run()方法的对象即可,它不必非要是Person的子类

五、获取对象信息

  1.type()

    判断对象类型,使用type()函数

>>> type(123)
<class 'int'>

  2.instance()

    判断属于某种类型

>>> isinstance(p, Person)
True

  3.dir()

    获取对象的所有属性和方法

>>> dir('ABC')
['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']

  仅仅把属性和方法列出来是不够的,配合getattr()setattr()以及hasattr(),我们可以直接操作一个对象的状态:

>>> hasattr(obj, 'x') # 有属性'x'吗?
True
上一篇: x window的奥秘
下一篇: C语言文法 改
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898