——王宇阳 总结 (Code_boy)2018年11月16日

 class Person:
name='xxx'
age=20 p=Person() #p为实例对象
print(p.name,p.age)
p.name="yyy"
p.gender='male'
print(p.name,p.gender,p.age)
print(Person.name,Person.age)

#p(实例对象)对值得修改不影响Person类中的内容
Person.age='30'
print(Person.age)
#class Person (类) 对值得修改将该影响Person类中的内容
'''

#访问权限(类的属性)
'''
class Person:   #Person中的name和age公有的
    name = 'james'
    age=20
#在python中规定在前面加两个下划线,就变为私有的
'''
'''
class Person:
    __name = 'james'        #私有的__name
    age = 20

def show(self):     #self >> 自己
        print(self.__name,self.age)     #自己访问自己 正常返回

p=Person ()
p.show()      #需要调用除show()函数,否则会拒绝class中的show的执行
print(Person.__name)            # 访问类中的私有属性 异常返回
print(p.age)
#出现私有的函数调用时,结果同样如此!私有的函数,元素只能在class中被使用
#常用的方法就是通过调用公有的函数来执行函数内的私有属性的调用
'''

#案例:编写个人信息并建立对象访问属性

 class Person:
name = 'xxx'
gender = 'x'
age = 0 p=Person()
print(p.name,p.gender,p.age)
print(Person.name,Person.gender,Person.age) p.name = 'A'
p.gender = 'Male'
p.age = 20 Person.name = 'B'
Person.gender = 'Female'
Person.age = 21 print(p.name,p.gender,p.age) #p实例对象属性
print(Person.name,Person.gender,Person.age) #Person类属性

#实例方法
'''

 class Person:
age = 20
def show(self):
print (self.age) p.Person()

#实例方法至少有一个参数,一般以名为(self)的变量作为该参数(名称可自定义)
#实例方法通过实例对象调用,例如:p.show()
#如果使用类名称调用,需要人为传递实例参数,例如:Person.show(p)
#实例方法被调用是要向他的第一个参数传递实例对象

 class Person:
name = 'james'
age = 12 def getName(self):
return self.name def getAge(self):
return self.age p=Person()
print(p.getName(),p.getAge()) #实例属性对象调用
print(Person.getAge(p)) #类名称调用
  def show(self,s):   #参数传递
print(self,s) p.show('hi') #'hi'值传递给s
Person.show(p,'hello') #hello 给 s'''

#类方法

 class Person:
age = 20
@classmethod
def show(cls):
print(cls.age) p=Person()

#类方法要使用 @classmethod 来修饰,而且第一个参数一般命名为cls(可另定名)
#类方法通常使用类的名称调用,例如:Person.show()
#类方法也可实例方法调用,例如:p.show()
#类方法调用时会向它的第一个参数传递类的名称

 class Person:
__name = 'james'
__age = 12 @classmethod
def show(self):
print(self)
print(self.__name,self.__age) Person.show()
p=Person()
p.show()'''

#静态方法
'''
定义:

 class Person:
age = 20
@staticmethod
def show():
print(Person.age) p = Person()

#静态变量函数通过@staticmethod修饰
#通常采用类的名称或者实例来调用静态方法,例如:Person.show(),p.show()
#在调用静态函数时不会向函数传递任何参数

 class Person:
__name = 'james'
__age = 12 @staticmethod
def show(): #静态不带参数
print(Person.__name) p = Person()
Person.show()
p.show()

#类、实例、静态方法 不同——Person

 class Person:
name = 'xxx'
gender = 'x'
age = 0
#实例方法
def instanceShow(self):
print(self.name,self.gender,self.age) @classmethod #类方法
def classShow(cls):
print(cls.name,cls.gender,cls.age) @staticmethod #静态方法
def staticShow():
print(Person.name,Person.gender,Person.age) p=Person()
p.instanceShow() #实例方法调用
Person.classShow() #类方法调用
Person.staticShow() #静态方法调用

实例方法一般用实例对象调用
类方法和静态方法一般用类名称调用

#对象初始化
'''
构造方法(函数)...>完成函数初始化
@ 构造方法__init__(self, ... )在生成对象时调用,
可以用来进行一些初始化操作,不需要显示去调用,系统默认执行
如果用户自己没有定义构造方法,系统就自己执行默认的额构造方法
__init__(self)在生成对象时调用
__del__(self)在释放对象时调用

 class Person:
def __init__(self,n,a):
self.name=n
aelf.age=a p=Person('xxx',20)
print(p.name,p.age)

@ 析构方法__del__(self)在释放对象时调用,可以在里面进行一些释放资源的操作
不需要显示调用

 class Person:
def __init__(self,n,a):
self.name = n
self.age = a
def __del__(self):
print('__del__',self.name,self.age) p=Person('xxx',20)
print(p.name,p.age) class Person:
def __init__(self):
print("__init__",self)
def __del__(self):
print("__del__",self) p=Person()

#__init__完成对象初始化

 class Person:
def __init__(self,n,g,a): #n,g,a 传参单位
self.name = n
self.gender = g
self.age = a def show(self):
print(self.name,self.gender,self.age) p=Person('james','male',20) #p对象确定后,p对象的初始化(n,a,m)就完成了
p.show()

#python规定:类中只能有一个构造函数
#...__init__中设置默认参数

 class Person:
def __init__(self,n='',g='male',a=0):
self.name = n
self.gender = g
self.age = a def show(self):
print(self.name,self.gender,self.age) a = Person('james')
b = Person('james','fenmale')
c = Person('james','male',20)
a.show() #结果:james male 0
b.show() #结果:james fenmale 0
c.show() #结果:james male 20
# __init__参数中如果设置了默认值,得到新的内容传参后则覆盖原值'''

#案例:日期类 MyDate

 class MyDate:
__months = [0,31,28,31,30,31,30,31,31,30,31,30,31]
def __init__(self,y,m,d):
if (y<0):
print("Error:无效年份")
if (m<1 or m>12):
print("Error:无效月份")
if (y%400 == 0 or y%4 == 0 and y%100!=0):
MyDate.__months[2] = 29
else:
MyDate.__months[2] = 28 if d<1 or d>MyDate.__months[m]:
print("Error:无效日期")
#日期,月份,年份均合法后,创建类的属性(内容)
self.year = y
self.months = m
self.day = d
def show(self,end='\n'):
print("%d-%d-%d"%(self.year,self.months,self.day),end = end) p = MyDate(2018,11,19)
p.show()

#类的继承
#派生与继承:Student:name gender age

 class Person:
def __init__(self,name,gender,age):
self.name = name
self.gender = gender
self.age = age def show(self,end='\n'):
print(self.name,self.gender,self.age) class Student(Person):
def __init__(self,name,gender,age,major,dept):
Person.__init__(self,name,gender,age)
self.major = major
self.dept = dept def show(self):
Person.show(self,'')
print(self.major,self.dept) s = Student('james','male',20,'softwart','computer')
s.show() '''
结果:
james male 20
softwart computer
'''

#继承类构造函数:

从上面的Strdent类的定义可以看除派生类的构造函数除了要完成自己的新增加的
major,dept属性的初始化外,还要调用基类的Person的构造函数,而且还要显示调用
    即: Person.__init__(self,neme,gender,age)
通过类名称Person直接调用Person的__init__函数,并提供所要的4个函数
继承类时不会自动调用基类的构造函数的,必须显示调用

#属性方法的继承:
如果一个基类中有一个实例方法,在继承类中也可以重新定义完全一样的实例方法。
例如 Person有show方法,在Student中也有一样的show方法,它们是不会混淆的
我们称Student类的show重写了Person的show
—当然,一个基类的实例方法也可以不被重写,派生类会继承这个基类的实例方法
-派生类也可以增加自己的新实例方法

 class Person:
className = 'Person' #自己的实例属性
def __init__(self,name,gender,age):
self.name = name
self.gender = gender
self.age = age def show(self,end='\n'):
print(self.name,self.gender,self.age) @classmethod #类方法修饰
def classClassName(cls):
print(cls.className) @staticmethod #静态方法修饰
def staticClassName():
print(Person.className) def display(self):
print('display') class Student(Person):
#className = 'Student'
def __init__(self,name,gender,age,major,dept):
Person.__init__(self,name,gender,age)
self.major = major
self.dept = dept def show(self):
Person.show(self,'')
print(self.major,self.dept) s = Student('A','male',20,'software','computer')
s.show()
print(Student.className) #Student本身没有,则显示上一级(Person)
Student.classClassName()
Student.staticClassName() s.display() #实例调用 #结果说明:Student继承了Person的实例、静态、类(属性)方法
#结果:
'''
A male 20
software computer
Person
Person
Person
display
'''

#案例 :年月日 + 时分秒

 class MyDate:
__months = [0,31,28,31,30,31,30,31,31,30,31,30,31]
def __init__(self,y,m,d):
if (y<0):
print("Error:无效年份")
if (m<1 or m>12):
print("Error:无效月份")
if (y%400 == 0 or y%4 == 0 and y%100!=0):
MyDate.__months[2] = 29
else:
MyDate.__months[2] = 28 if d<1 or d>MyDate.__months[m]:
print("Error:无效日期")
#日期,月份,年份均合法后,创建类的属性(内容)
self.year = y
self.months = m
self.day = d
def show(self,end='\n'):
print("%d-%d-%d"%(self.year,self.months,self.day),end = end) class MyDateTime(MyDate):
def __init__(self,y,mo,d,h,mi,s):
MyDate.__init__(self,y,mo,d)
if (h<0 or h>23 or mi<0 or mi>59 or s<0 or s>59):
print("Error:无效时间")
self.hour = h
self.minute = mi
self.second = s def show(self):
MyDate.show(self,'\t')
print("%d:%d:%d"%(self.hour,self.minute,self.second)) p = MyDateTime(2018,11,19,21,21,54)
p.show() #结果: 2018-11-19 21:21:54

python面向对象实例的更多相关文章

  1. python 面向对象初级篇

    Python 面向对象(初级篇) 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发" ...

  2. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  3. python面向对象进阶(八)

    上一篇<Python 面向对象初级(七)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  4. python 面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  5. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  6. python 面向对象和类成员和异常处理

    python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial di ...

  7. python 面向对象学习

    ------Python面向对象初 下面写一个类的简单实用,以便方便理解类 #python 3.5环境,解释器在linux需要改变 #阅读手册查询readme文件 #作者:S12-陈金彭 class ...

  8. 初识python面向对象

    一.初识python面向对象: class Person: #使用class关键字定义一个类 age=0 #类变量(静态变量) def eat(self,food): #定义一个方法 self.age ...

  9. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

随机推荐

  1. loj10104 [POI 2008]Blockade

    传送门 分析 我们知道对于一个割点,我们如果去掉它就会使原来的图被分为若干块,则这是我们将所有块包含的点的个数两两相乘即可,而如果不是割点则对于图的连通性没有影响.注意在最后要加上2*(n-1)表示去 ...

  2. C#关于如何修改项目文件夹名称

    在C# 中修改了解决方案项目名称之后,重命名之后出现错误形式: 解决方法就是 打开你的sln文件 ,将里面的地址改过来就好了 以记事本的方式打开.sln文件 修改其中的相对路径,下图选中部分的路径,这 ...

  3. 20169219《Linux内核原理与分析》课程总结

    第一周作业 这周主要学习l了linux基础入门这个课,还是很有用的.一周学完,前两个可能做起来比较慢,但是后面就快了,不要放弃希望,你可以的! 我就是没写到博客里面,哼哼,你就不要看了.自己总结吧,摊 ...

  4. [转]Oracle截取字符串相关函数

    转至:http://www.cnblogs.com/qmfsun/p/4493918.html 1.instr(sourceString,destString,start,appearPosition ...

  5. Sass和Compass设计师指南 Ben Frain 中文高清PDF扫描版​

    Sass和Compass设计师指南是<响应式Web设计:HTML5和CSS3实战>作者Ben Frain的又一力作.作者通过丰富.完整的案例,循序渐进地展示了Sass和Compass的使用 ...

  6. org.apache.commons.lang3包中的isEmpty和isBlank

    主要为了区分一下empty和blank的用法,先看源码: isEmpty public static boolean isEmpty(CharSequence cs) { return cs == n ...

  7. ASP.NET Core 部署到Cont OS 服务器

    一.前言 当 asp.net core 发布以后,实现了跨平台.基于好奇,我就测试了一下 core 项目部署到 linux 服务器.感觉一路还是有所收获,接下来记录一下操作流程. 工具:window ...

  8. 温故而知新_C语言_前缀++(--)和后缀++(--)

    前缀++(--)和后缀++(++)是有区别的. 再单独使用的时候是没有区别的,都是自身递增或者递减1. 但是综合使用起来会一样吗? 下面的例子都是++,替换成--也是一样,道理都是一样的. 请先看下面 ...

  9. Python3中简单的迭代器程序

    1.迭代器程序(实现菲比那次数列并且可以抛出与接收异常) def fib(max): n,a,b = 0,0,1 while n < max: #print(b) yield b a,b = b ...

  10. Java——事务

    一.事务(Transaction) 1. 在开发中我们的一个业务往往需要同时操作多个表,这些操作往往是不可分割,业务中的对数据库的多次操作,要么同时成功,要么全都失败. 2.注意:我们在同一个事务中使 ...