python面向对象

Posted 枫若雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python面向对象相关的知识,希望对你有一定的参考价值。

由面向对象的思想引入面向对象的设计,最后面向对象编程。

#!/usr/bin/env python
# coding:utf-8

def school(name,addr,type):
    def init(name, addr, type):
        sch = {
            \'name\': name,
            \'addr\': addr,
            \'type\': type,
            \'kao_shi\': kao_shi,
            \'zhao_sheng\': zhao_sheng,
        }
        return sch
    def kao_shi(school):
        print(\'%s 学校正在考试\' %school[\'name\'])
    def zhao_sheng(school):
        print(\'%s %s 正在招生\' %(school[\'type\'],school[\'name\']))
    return  init(name,addr,type)

print("面向对象的设计")

s1=school(\'oldboy\',\'沙河\',\'私立学校\')
print(s1)
print(s1[\'name\'])

s1[\'zhao_sheng\'](s1)

s2=school(\'清华\',\'北京\',\'公立学校\')

print(s2)
print(s2[\'name\'],s2[\'addr\'],s2[\'type\'])
s2[\'zhao_sheng\'](s2)

 

类的练习二:

#!/usr/bin/env python
# coding:utf-8

class Chinese:
    \'\'\'这里写文档注释\'\'\'
    area = "Asia"

    # def init(name,age,gender):
    #     dic={
    #         \'name\':name,
    #         \'age\':age,
    #         \'gender\':gender
    #     }
    #     return dic

    def __init__(self, name, age, gender):
        print("start...")
        self.aname = name
        self.aage = age
        self.agender = gender
        print("end...")
        ## 自动return None 所以,不能加return

    def dun(self):
        print("%s 亚洲蹲在 %s " % (self.aname,self.area))

    def speak(self,lang):
        print("%s 讲%s " % (self.aname, lang))


p1 = Chinese("Tom",22,"male")  # 实例化
print(p1.__dict__) #查看实例的字典
print(p1.aname)
print(p1.agender)
print(p1.area)

p1.dun()
p1.speak(\'本地方言\')
print(p1.area)

# 修改
Chinese.area = \'东方大陆\'

# 修改函数
def xia_dun(self):
    print("%s 坐在了地上。" % self.aname)

Chinese.dun = xia_dun  # 修改了类的内部函数

# 增加
Chinese.skin = \'yellow\'


p2 = Chinese("小明",11,"")
print(p2.area)
print(p2.skin)
print(p1.skin) # 之前的实例也可以用,因为实例是对类的引用
p2.dun()

# 删除
# del Chinese.area
# print(p2.area)

 

类的数据属性和函数属性:(这个说法不同于C# Java PHP)

#!/usr/bin/env python
# coding:utf-8

## 类:把一类事物的相同的特征和动作整合到一起就是类,类是一个抽象的概念
## 对象:就是基于类而创建的一个具体的事物(具体存在的)也是特征和动作整合到一起

# class Chinese: # 经典类 python2中的区分
#     \'\'\'这是一个中国人的类\'\'\'
#     pass
#
# print(Chinese)
#
#
# class Chinese(object): # 新式类 python2中的区分
#     pass

# 实例化到底干了什么?
# p1 = Chinese()  # 实例化 并不像其它语言使用new
# print(p1)


## python3中不再区分,都是新式类
class Chinese:
    \'\'\'这里写文档注释\'\'\'
    # 1 数据属性
    area = "Asia"

    # 2 函数属性
    def dun():
        print("亚洲蹲")

    def speak(self):
        print("讲汉语 %s" % self)


print(dir(Chinese))
print(Chinese.__dict__)  # 查看类的属性字典,字典里存放着类的数据属性和函数属性

print(Chinese.area)
Chinese.dun()  # 直接执行类中的函数
Chinese.__dict__[\'dun\']()  # 通过字典方式调用类中函数
Chinese.__dict__[\'speak\']("你好")

print(Chinese.__name__)  # 类名
print(Chinese.__doc__)  # 类的文档注释
print(Chinese.__base__)  # 基类 <class \'object\'>
print(Chinese.__bases__)  # 基类 (<class \'object\'>)
print(Chinese.__module__)  # 来自模块

 

面向对象应该分清楚实例和类:

#!/usr/bin/env python
# coding:utf-8

class Chinese:
    \'\'\'这里写文档注释\'\'\'
    country = "China"

    def __init__(self, name):
        self.aname = name

    def speak(self,lang):
        print("%s 讲%s " % (self.aname, lang))

p1 = Chinese(\'alex\')
print(p1.__dict__)

# 查看
print(p1.speak)  # 只得到实例中函数的内存地址
p1.speak(\'汉语\')

# 增加实例中的属性
p1.age = 18
print(p1.__dict__)
print(p1.age)

## 不要修改实例的函数属性,虽然可以操作。因为不规范
## 可以通过__dict__的方式更改字典,但是也不建议这么做,因为不稳定。

# 删除
del p1.age
print(p1.__dict__)


## 分清类和实例
p1.country = "zh"
print(Chinese.country) # 这是类的
print(p1.country)  # 这是实例的

 

老师http://www.cnblogs.com/linhaifeng/articles/6182264.html

分清类和实例操作的例子:

#!/usr/bin/env python
# coding:utf-8

country = "中国"

class Chinese:
    \'\'\'这里写文档注释\'\'\'
    country = "China"

    li = [\'a\',\'b\']

    def __init__(self,name):
        self.name = name
        print(\'-----------------\',country) # 这里的country只相当于普通的变量,跟类没有关系,因为没有通过点来调用

        # self.name = input("请输入用户名:") # 不建议在函数中使用输入输出。 混乱,可读性差

    def speak(self,lang):
        print("%s 讲%s " % (self.aname, lang))

p1 = Chinese(\'alex\')
print("实例内调用", p1.country)  # 点的方式调用是从类的内部
print("类调用", Chinese.country)


print(p1.li)
# p1.li = [1,2,3]  # 实例的list被重新赋值
# print(p1.__dict__)  # 返回{\'name\': \'alex\', \'li\': [1, 2, 3]}
# print(Chinese.li)  # 返回 [\'a\', \'b\']

p1.li.append(\'c\') # 附加了类中列表的元素
print(p1.__dict__)  # 实例的字典中没有 li 这个列表
print(Chinese.li)  # 类的列表被添加内容

 

以上是关于python面向对象的主要内容,如果未能解决你的问题,请参考以下文章

python之路之前没搞明白4面向对象(封装)

Python面向对象学习之八,装饰器

python:第二部分:面向对象:面向对象object orinted

面向面试编程代码片段之GC

Python 面向对象

面向对象编程其实很简单——Python 面向对象(初级篇)