Python 高阶 面向对象 继承

#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')
'''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值