#coding=utf-8
'''
Python类的遗留问题,在2.2之前使用老式类,之后出现了新式类。而在3以后则都是使用新式类
老式类和新式类的差别在于新式类继承了Object
看下区别
'''
class OldStyle:
def __init__(self, name,message):
self.name = name
self.message=message
class NewStyle(object):
def __init__(self, name,message):
self.name = name
self.message=message
oldStyle= OldStyle("oldStyle","老式类")
newStyle= NewStyle("oldStyle","新式类")
print oldStyle
print type(oldStyle)
print dir(oldStyle)
print '-----------------------------------------------------------'
print newStyle
print type(newStyle)
print dir(newStyle)
#结果
'''
<__main__.OldStyle instance at 0x03094AA8>
<type 'instance'>
['__doc__', '__init__', '__module__', 'message', 'name']
-----------------------------------------------------------
<__main__.NewStyle object at 0x030922B0>
<class '__main__.NewStyle'>
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'message', 'name']
对比结果可以看出 两个类在定义上就有很大的区别,老式类的类型是instance 而非OldStyle,新式类则是NewStyle类型,
另外新式类比老式类多了很多内置函数
'''
#类 类有属性和方法组成
#类的属性访问权限
'''
很遗憾,python中并没有 控制权限,全靠自觉。
'''
class Person:
def __init__(self, name,sex,weight):
self.name = name
self._sex=sex #表示为私有,但是并没有卵用
self.__weight=weight #python会改变这个属性
def getWeight(self):
return self.__weight
def getSex(self):
return self._sex
def toString(self):
return self.__class__,self.__dict__
person=Person("jia","boy",22)
#打印类里的字典
print person.__dict__
#结果
'''
{'_sex': 'boy', 'name': 'jia', '_Person__weight': 22}
你会发现 __weight 变成了_Person__weight
'''
print person.name
print person._sex
print person._Person__weight
#结果
'''
jia
boy
22
如果调用__weight则会报错:AttributeError: Person instance has no attribute '__weight'
'''
#类的方法访问权限和属性的访问权限一致 方法名前加__的会被改名
class Person:
def __init__(self, name,sex,weight):
self.name = name
self._sex=sex #表示为私有,但是并没有卵用
self.__weight=weight #python会改变这个属性
def getWeight(self):
return self.__weight
def _getSex(self):
return self._sex
def __toString(self):
return self.__class__,self.__dict__
#类的装饰器
'''
@classmethod 类方法,通过类直接调用方法 类似于java中的静态方法
@property 方法按照属性调用,即调用时不用带()
'''
class Person:
weight=70
def __init__(self, name,sex):
self.name = name
self.sex=sex
@classmethod
def getWeight(self):
return self.weight
@property
def getSex(self):
return self.sex
def toString(self):
return self.__dict__
person=Person("jia","boy")
print Person.getWeight()
print person.getSex
print person.toString()
#结果
'''
70
boy
{'name': 'jia', 'sex': 'boy'}
注意使用@classmethod时,属性必须是类属性
'''
#coding=utf-8
#定义一个类 三个属性 一个方法
class Person(object):
def __init__(self, name,age,sex):
self.name = name
self.age = age
self.sex = sex
def getName(self):
return self.name
#定义一个子类
class Student(Person):
def __init__(self, name,age,sex,id,school):
super(Student, self).__init__(name,age,sex) #父类初始化
#本类属性
self.id = id
self.school = school
student=Student("yi",18,"boy",1002,"qinghua")
print student.__dict__ #{'id': 1002, 'age': 18, 'school': 'qinghua', 'name': 'yi', 'sex': 'boy'}
print type(student)#<class '__main__.Student'>
#判断后者是否是前者的父类
print isinstance(student,Person) #True
#多态 方法重写
class Person(object):
def __init__(self, name,age,sex):
self.name = name
self.age = age
self.sex = sex
def getName(self):
return self.name
class Student(Person):
def __init__(self, name,age,sex,id,school):
super(Student, self).__init__(name,age,sex) #父类初始化
#本类属性
self.id = id
self.school = school
#方法重写
def getName(self):
return self.id,self.name
person=Person("yi",18,"boy")
student=Student("yi",18,"boy",1002,"qinghua")
print person.getName()
print student.getName()
#结果
'''
yi
(1002, 'yi')
'''
Python 高阶 面向对象 继承
最新推荐文章于 2024-08-07 16:30:13 发布