Python学习之类

来源:互联网 发布:windows无法识别音响 编辑:程序博客网 时间:2024/06/15 00:40
# coding=utf-8_
_author__ = "leaves"


# 简单定义类
# name前面加双下划线是让其变为私有化,不加的话可以直接通过变量名访问
# self相当于C++的this指针
# 同一个类可以生成无数个对象,这些对象都很相似,因为他们来源于同一个类,当一个对象的方法
# 被调用的时候,对象会将自身作为第一个参数,Python就知道哪一个对象在调用方法了
class Persson:
    def setName(self, name):
        self.__name = name


    def getName(self):
        return self.__name


    def greet(self):
        print "Hello, world! I'am %s." % self.__name




foo = Persson()
foo.setName('Lucy')
bar = Persson()
bar.setName('Lily')
foo.greet()
bar.greet()


# 定义了一个可供所有成员(实例)访问的变量
class MemberCount:
    members = 0


    def init(self):
        MemberCount.members += 1




m1 = MemberCount()
m1.init()
print m1.members
m2 = MemberCount()
m2.init()
print m2.members


print '----------------------------------'
# 超类(继承两个子类)
class Calculator:
    def calculate(self, expression):
        self.value = eval(expression)




class Talker:
    def talk(self):
        print 'Hi, my value is ', self.value




class TalkingCalculator(Calculator, Talker):
    pass




tc = TalkingCalculator()
tc.calculate('1+2*3')
tc.talk()
print '----------------------------------'
print isinstance(tc, Talker)
print isinstance(tc, TalkingCalculator)


print hasattr(tc, 'talk')
print hasattr(tc, 'tald1')


# 默认值为None
print callable(getattr(tc, 'talk', None))
print callable(getattr(tc, 'talk1', None))
setattr(tc, 'value', '4+6')
print tc.talk()


print '----------------------------------'
import random as r




# 调用基类的初始化方法
class Fish:
    def __init__(self):
        self.x = r.randint(0, 10)
        self.y = r.randint(0, 10)


    def move(self):
        self.x -= 1
        print '我的位置是:', self.x, self.y




class GoldFish(Fish):
    def __init__(self):
        Fish.__init__()
        # 或者
        super.__init__()
        self.hungry = False




class C:
    pass


# 一个类认为是其自身的子类
print issubclass(GoldFish, GoldFish)
print issubclass(GoldFish, Fish)
print issubclass(GoldFish, object)
# 第二个参数可以是一个元组
print issubclass(GoldFish, (C, object))
print '----------------------------------'


# property通过属性设置属性,假如某天需要修改setSize,getSize,我们只要修改property,
# 调用的地方不需要修改
class C:
    def __init__(self, size=10):
        self.size = size


    def setSize(self, size):
        self.size = size


    def getSize(self):
        return self.size


    def delSize(self):
        del self.size


    # 跟后面的属性操作保持一致
    x = property(getSize, setSize, delSize)




c1 = C()
print c1.getSize
print c1.x
c1.x = 18
print c1.x
del c1.x
print '----------------------------------'
# 组合(没有继承关系的类放在一起)
class Turtle:
    def __init__(self, x):
        self.num = x




class Fish:
    def __init__(self, x):
        self.num = x




class Pool:
    def __init__(self, x, y):
        self.turtle = Turtle(x)
        self.fish = Fish(y)


    def print_num(self):
        print "水池里总共有乌龟 % d 只, 小鱼 %d 条!" % (self.turtle.num, self.fish.num)




pool = Pool(1, 10)
pool.print_num()
print '----------------------------------'
# 属性定义了和类方法相同
class C:
    def x(self):
        print "X-Man"




c = C()
c.x()
# python属性不需要声明,c对象的属性
c.x = 1
print c.x
# 下面会出错,属性名和方法名相同,属性会覆盖方法,属性用名词,方法用动词
# c.x()
print '----------------------------------'




class CC:
    def setXY(self, x, y):
        self.x = x
        self.y = y


    def printXY(self):
        print (self.x, self.y)




dd = CC()
print dd.__dict__
print CC.__dict__
dd.setXY(4, 5)
print dd.__dict__
print CC.__dict__
del CC
dd.printXY()
del CC
# 找不到CC了
# ee = CC()
# 类中定义的属性和方法是静态变量,就算类对象被删除了,他们依然存在内存中,所以编程中应该考虑使用实例属性(self.**),
# 而不是使用类属性,类属性只用来跟踪跟类相关的值

dd.printXY()


输出:

"D:\Program Files\Python\python.exe" G:/HelloPython/list/class.py
Hello, world! I'am Lucy.
Hello, world! I'am Lily.
1
2
----------------------------------
Hi, my value is  7
----------------------------------
True
True
True
False
True
False
Hi, my value is  4+6
None
----------------------------------
Traceback (most recent call last):
  File "G:/HelloPython/list/class.py", line 190, in <module>
    del CC
NameError: name 'CC' is not defined
True
True
False
False
----------------------------------
<bound method C.getSize of <__main__.C instance at 0x000000000258E8C8>>
10
18
----------------------------------
水池里总共有乌龟  1 只, 小鱼 10 条!
----------------------------------
X-Man
1
----------------------------------
{}
{'__module__': '__main__', 'printXY': <function printXY at 0x0000000002597898>, 'setXY': <function setXY at 0x0000000002597828>, '__doc__': None}
{'y': 5, 'x': 4}
{'__module__': '__main__', 'printXY': <function printXY at 0x0000000002597898>, 'setXY': <function setXY at 0x0000000002597828>, '__doc__': None}
(4, 5)


Process finished with exit code 1


0 0