python 类

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time   : 2017/11/06 22:46
# @Author : lijunjiang
# @File   : class.py

"""
类有一般形式

使用class 关键字可以创建一个类,class 后为类的名称并 ()表示的继承默认为object 并以冒号结尾,即:
class class_name(object):
    '类的帮助信息'  #类的文档字符串
    class_suite     #类体

object 默认是所有类的父类,不写默认继承object

"""
# 创建一个类
class myclass(object):
    '''this is a class about myclass'''
    myclass_name = 'myclass'
    myclass_info = 'is a class'
    def myclass_func(self):
        print('hello, is a my first class!')

"""
说明:
myclass_name和myclass_info 是类myclass的两个变量,它们的值将在这个类所有的实例间共享,可能使用
实例名.myclass_name 或 实例名.myclass_info 访问这两个变量

myclass_func 是类的方法,该方法可以在这个类的所有实例中以 实例名.myclass_func()  的方式调用
"""

# 类的实例化
a = myclass()
print(type(a))

# 执行结果:<class '__main__.myclass'>

# 访问类的变量
print(a.myclass_name)
print(a.myclass_info)

# 执行结果:
# myclass
# is a class

# 调用类的方法

a.myclass_func()

# 执行结果:hello, is a my first class!

# 在实例中改变类变量的值,实例.类变量名 = '要赋的值'
print(a.myclass_name)
a.myclass_name = 'set myclass_name'
print(a.myclass_name)

# 执行结果:
# myclass
# set myclass_name

"""
类的构造器

构造函数:__init__
作用:在生成对象时调用,在创建一个类时,有一些在实例化时必须绑定某些属性时,可以定义一个__init__方法
将其强制填写进去。

例如声明一个ren的类,在实例化时必须填入name 和sex 时
"""
# 声明一个ren的类,具有name sex 属性
class ren():    # 不指定其父类,默认继承object类
    def __init__(self, name, sex):
        self.name = name
        self.sex = sex

# # 创建一个类为ren的man实例,不指定name sex 属性时
# man = ren()
# 执行结果:报错-缺少必要的参数
# Traceback (most recent call last):
#   File "D:/Python/class/class1.py", line 80, in <module>
#     man = ren()
# TypeError: __init__() takes exactly 3 arguments (1 given)

# 创建一个类为ren的man实例,同时指定name sex
man = ren("man", "m")
print(man.name)
print(man.sex)

# 执行结果:
# man
# m

"""
说明:
类的方法与普通函数只有一个特别的区别-它们必须有一个额外的第一个参数名称,self
参数self 代表类的实例,而非类
在调用时,self参数不用传入,在上例中Python会自动把ren实例化的man传递给第一个参数,即self

在类实例化时,如果在构造函数__init__中声明了类的某些必须属性,则在实例化这个类时,必须传入对应的参数,否则会报错
"""

"""
类的继承
class A()
class B(A)
class C(A,B)
"""

# 声明一个peson类,具有属性name 和sex ,方法 info()
class peson(object):
    # name = 'peson'
    # sex = 'F or M'
    def __init__(self, name='peson', sex='F or M'):
        self.name = name
        self.sex = sex
    def info(self):
        print('hello {0},your is a {1}'.format(self.name, self.sex))

# 声明一个man类,继承peson类,具有方法
class man(peson):
    def man_func(self):
        print('My name is {0}, I am a {1}'.format(self.name, self.sex))


# 初始化一个peson实例
a = peson()
print(a.name)
print(a.sex)
a.info()
# 执行结果:
# peson
# F or M
# hello peson,your is a F or M

#初始化一个man实例
m = man()
print(m.name)
print(m.sex)
m.info()
m.man_func()
print(dir(m))
# 执行结果:
# peson
# F or M
# hello peson,your is a F or M
# My name is peson, I am a F or M
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__',
# '__new__', ' '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
#  'info', 'man_func', 'name', 'sex']
"""
由上面例子可以看出:
man 类 继承了 peson 类,拥有poson类的属性name sex 和方法 info(),同时也具有自已的方法 man_func()
"""
print('=====================类的重写==========================')

class peson_new(object):
    name = 'peson'
    sex = 'F or M'
    def __init__(self):
        print('hello {0},your is a {1}'.format(self.name, self.sex))
    def info(self):
        print('This is a function info of peson class')

class man_1(peson_new):
    name = 'man'
    sex = 'M'
    def info(self):
        print('This is new function info of man_1 class')

print('peson 类的属性 和 方法')
p = peson_new()
print(p.name)
print(p.sex)
p.info()
print('man_1 类的属性和方法')
m2 = man_1()
print(m2.name)
print(m2.sex)
m2.info()
# 执行结果:
# =====================类的重写==========================
# peson 类的属性 和 方法
# hello peson,your is a F or M
# peson
# F or M
# This is a function info of peson class
# man_1 类的属性和方法
# hello man,your is a M
# man
# M
# This is new function info of man_1 class
"""
在子类中,使用与父类中相同变量或方法名,可以重新定义父类中的属性和方法
"""

print("=====================类的多继承========================")
# 声明一个girl类,同时继 peson 类和 man 类
class girl(man):
    def girl_func(self):
        print('I like myself ,name is {0}'.format(self.name))

# 声明一个man 实例和一个 gril实例

m1 = man('Dalang Wu',"M")
g = girl('Jinglian Pan', 'F')

# 打印它们的属性
print("man实例属性")
print(m1.name)
print(m1.sex)
print('man实例方法')
m1.info()
m1.man_func()

print('gril实例的属性')
print(g.name)
print(g.sex)
print('gril实例的方法')
g.info()
g.man_func()
g.girl_func()


# 执行结果:
# =====================类的继承========================
# man实例属性
# Dalang Wu
# M
# man实例方法
# hello Dalang Wu,your is a M
# My name is Dalang Wu, I am a M
# gril实例的属性
# Jinglian Pan
# F
# gril实例的方法
# hello Jinglian Pan,your is a F
# My name is Jinglian Pan, I am a F
# I like myself ,name is Jinglian Pan
#
# Process finished with exit code 0

"""
从上例可以看出:
当man类继承了peson类后,man具有了peson类的属性和方法
当girl类同时继承了peson类和man类时,同时具备这两个类的属性和方法
这就是类的多继承
"""

posted @ 2017-11-07 00:38  考鸡蛋  阅读(301)  评论(1编辑  收藏  举报