您的位置:首页 > 编程语言 > Python开发

Python面向对象入门

2016-08-24 17:03 627 查看
http://www.math.pku.edu.cn/teachers/qiuzy/ds_python/courseware/
这本书的第二章写的是抽象数据类型和Python类以前从没想过认真的去写Python但是既然用Python去学Spark了现在就要认真对待Python进行数据处理的基础了整体上看除了更随意的感觉之外和java或者cpp的感觉差不多
类可以定义在程序的任何地方,一般都是写在最外层
类的实例使用__init__(self)函数初始化_num在属性前面加下划线就是默认的私有变量__method这样的属性类外无法访问__add__, __init__, __st__,等是特殊的意义的函数
属性不需要定义,直接使用
实例也是独立的数据体可以传递到其他的函数中也可以作为其他实例的属性值这可以构造成复杂的对象结构
类中三种方法实例方法:智能通过实例调用,方法对象例如p.m(a,b)也是一种对象,可以写成q=p.m然后用q(a,b)去执行静态方法:@staticmethod,函数里面没有self参数,可以用类名字调用,可以用self调用,也可以实例调用类方法:@classmethod,习惯使用cls作为参数,可以访问类属性,无法访问实例属性,关注从类中调用而不是实例调用可以认为类方法进行的是类内部的数据的转换,实例方法进行的数据的输出,静态方法可以做一些独立的验证

动态约束:
class B:

def f(self):

self.g()

def g(self):

print("B.g Called.")

class C(B):

def g(self):

print("C.g Called.")


b = B()

c = C()

b.f()

c.f()#调用f()的时候self是c的实例,所以调用c的g()

'''

B.g Called.

C.g Called.

'''

[/code]下面是一个完整的面向对象的例子:
#导入可以获取日期的包

import datetime


#继承现有的错误类型,创建两个空的错误类

class PersonTypeError(TypeError):

pass


class PersonValueError(ValueError):

pass


#构造基类Person

class Person:

_num = 0


@staticmethod

def _hello(str):

return print("我是静态方法"+ str)



def __init__(self,name ,sex, birthday, ident):


if not(isinstance(name, str)) and sex in ("男","女"):#name 不是字符串或者性别不是这两个的时候报错

raise PersonTypeError(name ,sex)

try:

birth = datetime.date(*birthday)

except:

raise PersonValueError("Wrong date:", birthday)

self._name  = name#表示约定的私有属性

self._sex = sex

self._birthday = birthday

self._id = ident

Person._num += 1#每调用一次初始化,这个值都增加1,表示计数



def id(self):#定义简单的方法取出内部的属性值,相当于简单的getter方法

return self._id

def name(self):

return self._name

def sex(self):

return self._sex

def birthday(self):

return self._birthday

def age(self):

return (datetime.date.today().year - self._birthday.year)


def set_name(self,name):#定义简单的方法:设置属性值,相当于简单的setter方法

if not isinstance(name, str):

raise PersonValueError("set_name", name)

self._name = name


def __lt__(self,another):#小于运算的方法要求另外的一个参数也是Person的实例

if not isinstance(another, Person):

raise PersonTypeError(another)

return self._id < another._id


@classmethod

def num(cls):#获取计数

return Person._num


def __str__(self):

return " ".join((self._id,self._name,self._sex,str(self._birthday)))


def details(self):

self._hello("self调用")

return ", ".join(("编号: " + self._id,

  "姓名: " + self._name,

  "性别: " + self._sex,

  "出生日期: " + str(self._birthday)))

#join参数要求可迭代的元组


#手动实例化

p1 = Person("jason","男",(1992,8,12),"201422501030")

p2 = Person("peggy","女",(1994,10,14),"201422501032")

p3 = Person("shown","男",(1993,8,13),"201422501031")

p4 = Person("thea","女",(1995,11,15),"201422501033")


plist2 = [p1,p2,p3,p4]

for p in plist2:

print(p)


print("\nAfter Sorting:")

plist2.sort(key=None, reverse=True)

for p in plist2:

print(p.details())


print("People created:", Person.num(),"\n")


Person._hello("Persop调用")

p1._hello("实例调用")



#继承创建第一个类:学生类

class Student(Person):

_id_num = 0


@classmethod

def _id_gen(cls):

cls._id_num+=1

year = datetime.date.today().year

return "1{:04}{:05}".format(year, cls._id_num)#构造学生学号,1+年份+编号


def __init__(self,name,sex,birthday,department):#重写初始化方法,

Person.__init__(self, name, sex, birthday, Student._id_gen())#指明了父类,要self参数

self._department = department

self._enroll_date = datetime.date.today()

self._courses = {}  #空字典


def set_course(self,course_name):

self._courses[course_name] = None#给key赋值,value为空


def set_score(self,course_name,score):

if course_name not in self._courses:

raise PersonValueError("No this course selected:", course_name)

self._courses[course_name] =score#给value赋值


def scores(self):

return [(cname, self._courses[cname]) for cname in self._courses]


def details(self):

return ", ".join((Person.details(self),

  "入学日期: " + str(self._enroll_date),

  "院系: " + self._department,

  "课程记录: " + str(self.scores())))


s1 = Student("Charles","男",(1992,8,12),"Automation Dept")

s2 = Student("jason","男",(1991,9,18),"Cybernetics Dept")

print(s1)

s1.set_course("Python")#选课

s1.set_score("Python", 90)#给分

s1.set_course("Spark")

s1.set_score("Spark",100)

print(s1.scores())

print(s1.details())

print(s2.details())

print("\n")



#继承创建第二个类:员工类 

class Staff(Person):

_id_num = 0


@classmethod

def _id_gen(cls,birthday):

cls._id_num +=1

birth_year = datetime.date(*birthday).year

return "0{:04}{:05}".format(birth_year, cls._id_num)


def __init__(self,name,sex,birthday,entry_date=None):

super().__init__(name, sex, birthday, Staff._id_gen(birthday))


if entry_date:

try:

self._entry_date = datetime.date(*entry_date)

except:

raise PersonValueError("Wrong date:", entry_date)

else:

self._entry_date = datetime.date.today()


self._salary = 1720

self._depertment = "未定"

self._position = "未定"


def set_salary(self,amount):

if not type(amount) is int:

raise TypeError

self._salary = amount

def set_posotion(self,position):

self._position = position

def set_department(self,department):

self._depertment = department

def details(self):

return ", ".join((super().details(),

 "入职日期: " + str(self._entry_date),

 "院系: "+ self._depertment,

 "职位: " + self._position,

 "工资: " + str(self._salary)))


t1 = Staff("natasha","女",(1991,9,18))

t2 = Staff("heater","女",(1992,10,19))


print(t1)

print(t2)

t1.set_department("数学")

t1.set_posotion("讲师")

t1.set_salary(8888)


print(t1.details())

print(t2.details())

[/code]程序的执行结果:
201422501030 jason 男 (1992, 8, 12)

201422501032 peggy 女 (1994, 10, 14)

201422501031 shown 男 (1993, 8, 13)

201422501033 thea 女 (1995, 11, 15)


After Sorting:

我是静态方法self调用

编号: 201422501033, 姓名: thea, 性别: 女, 出生日期: (1995, 11, 15)

我是静态方法self调用

编号: 201422501032, 姓名: peggy, 性别: 女, 出生日期: (1994, 10, 14)

我是静态方法self调用

编号: 201422501031, 姓名: shown, 性别: 男, 出生日期: (1993, 8, 13)

我是静态方法self调用

编号: 201422501030, 姓名: jason, 性别: 男, 出生日期: (1992, 8, 12)

People created: 4


我是静态方法Persop调用

我是静态方法实例调用

1201600001 Charles 男 (1992, 8, 12)

[('Python', 90), ('Spark', 100)]

我是静态方法self调用

编号: 1201600001, 姓名: Charles, 性别: 男, 出生日期: (1992, 8, 12), 入学日期: 2016-08-24, 院系: Automation Dept, 课程记录: [('Python', 90), ('Spark', 100)]

我是静态方法self调用

编号: 1201600002, 姓名: jason, 性别: 男, 出生日期: (1991, 9, 18), 入学日期: 2016-08-24, 院系: Cybernetics Dept, 课程记录: []



0199100001 natasha 女 (1991, 9, 18)

0199200002 heater 女 (1992, 10, 19)

我是静态方法self调用

编号: 0199100001, 姓名: natasha, 性别: 女, 出生日期: (1991, 9, 18), 入职日期: 2016-08-24, 院系: 数学, 职位: 讲师, 工资: 8888

我是静态方法self调用

编号: 0199200002, 姓名: heater, 性别: 女, 出生日期: (1992, 10, 19), 入职日期: 2016-08-24, 院系: 未定, 职位: 未定, 工资: 1720

[/code]

来自为知笔记(Wiz)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: