1.简述
- 面向对象方法:面向对象方法是一种把对象的思想应用于软件开发过程中,指导开发活动的系统方法。
(Object-Oriented Method),简称OO方法。
对象程序的主要特性:
- 封装性:数据仅能通过一组接口函数来获取,经过封装的数据能确保信息的隐秘性。
- 继承性:通过继承的特性,衍生类继承了其基础类的成员变量与类方法。衍生类也叫作次类或子类,基础类也叫作父类。
- 多态性:允许一个函数有多种不同的接口。依照调用函数时使用的参数,类知道使用哪一种接口。Python使用动态类型与后期绑定实现多态功能。
2.定义类,创建实例
- Python使用关键字class来定义类
class Demo(object):
"""文档字符串。"""
go = '4'
def fun1(self):
print("hello world!")
d = Demo()
d.fun1()
print(Demo.__doc__) # 查看帮助文章信息
- fun1是Demo类的一个方法
- d是Demo类的一个实例对象。
- go是一个类变量。
- 类的帮助信息可以通过**className.__doc__**查看。
- self在对象内指对象本身。
3.__init__()方法
Python使用 __init__() 函数作为对象的构造方法
__init__语句定义了类的构造方法,在创建实例的同时设置类的属性值。
class Demo(object):
"""文档字符串。"""
go = '4'
def __init__(self, name, price):
self.name = name
self.price = price
def fun1(self):
print("hello world!")
d = Demo('abc', 30)
print('go:', d.go)
print('name:', d.name)
print('price:', d.price)
4.类的私有属性
class Demo(object):
"""文档字符串。"""
# 定义基本属性
name = 'x'
price = 0
# 定义私有属性
__city = "Beijing"
# 定义构造方法
def __init__(self, name, price,city):
self.name = name
self.price = price
self.__city = city
def fun1(self):
print("city:%s,name:%s,price:%s" % (self.__city, self.name, self.price))
d = Demo('abc', 30, "Shanghai")
d.fun1()
print(Demo.price)
print(Demo.name)
- 写在__init__上边的也是类属性(类变量),也可以通过类来访问。也是实例对象的属性,类变量被该类所有实例所共享。实例对象在创建时如果传入的属性值对其有修改,则覆盖之。但类的属性值不变。(也可以表述为,对于实例变量,如果实例变量的名称与类变量名称相同,Python就会使用实例变量的名称)
- 以该例为例,要创建出一个实例对象,必须写入name,price, __city三个属性,少一个字实例无法被创建出。
- 其中__city属性是私有属性,不能直接通过外部访问。但是可以通过类内部定义的方法进行访问,如fun1输出的内容中有关于city属性的描述。
- 对于永远不会变的属性,可以写在__init__()上方,在__init__内不再写,创建时也不用再传入。
5.类的内置属性
(1)字典对象的值,__dict__
类的属性是以字典对象的形式存储的。即__dict__属性
class Demo(object):
"""文档字符串。"""
a = 100
print(Demo.__dict__)
(2)文件字符串,__doc__
class Demo(object):
"""文档字符串。"""
a = 100
print(Demo.__doc__)
(3)类名,__name__
class Demo(object):
"""文档字符串。"""
a = 100
print(Demo.__name__)
(4)包含此类的模块名, module
class Demo(object):
"""文档字符串。"""
a = 100
print(Demo.__module__)
(5)此类的基类名称,__bases__
class Demo(object):
"""文档字符串。"""
a = 100
class DDemo(Demo):
"DDemo类继承类Demo"
b = 200
print(DDemo.__bases__)
该属性是一个tuple对象。
6.类的实例
(1)实例默认属性
- 在不添加任何属性的情况下,创建出的实例对象默认有两个属性:①id ②type
class Demo(object):
"""文档字符串。"""
a = 100
d = Demo()
print(id(d))
print(type(d))
(2)内置函数isinstance(instance_object,class_object)
- 用于测试某实例是否为某类的实例
class Demo(object):
"""文档字符串。"""
a = 100
d = Demo()
print(isinstance(d, Demo))
(3)类变量与实例变量
class Demo(object):
"""文档字符串。"""
default_age = 18 # 类变量
def __init__(self):
self.age = Demo.default_age # 实例变量 这里调用default_age的值前边必须有类名Demo前缀。
d = Demo()
在该例子中default_age是类变量,也被所有实例变量所共享,可以通过d.default_age访问。
print(d.default_age)
同时实例d也有age属性,也可以通过d.age访问。
但是Demo类没有age属性。
如果实例变量名称设置的与类变量名称相同,Python就会使用示例变量的名称。
(4)类实例的内置属性
- __init__ 属性字典
class Demo(object):
"""文档字符串。"""
def __init__(self, name=None, price=None,city=None):
self.name = name
self.price = price
self.city = city
d = Demo()
print(d. __dict__)
- __class__ 类名
class Demo(object):
"""文档字符串。"""
def __init__(self, name=None, price=None,city=None):
self.name = name
self.price = price
self.city = city
d = Demo()
print(d. __class__)
7.类的内置方法
(1) __init__(self):
类的构造方法,当创建一个类的实例时,就会调用该方法。
(2)__str__(self):
返回一个字符串对象,用来设置对象以字符串类型出现时如何显示。(该方法被内置函数str()和print()函数调用)
对比以下两组代码:
class Demo(object):
def __init__(self, arg):
self.name = arg
d = Demo("Tom")
print(d)
调用__str__方法后,再打印出这个实例,则显示的是该实例的name属性(名称)。这个可以用来设置我们想在输出后看到的内容。
class Demo(object):
def __init__(self, arg):
self.name = arg
def __str__(self):
return self.name
d = Demo("Tom")
print(d)