Python语言中,使用class关键字来创建类,其创建方式如下:
class ClassName(bases):
# class documentation string 类文档字符串,对类进行解释说明
class_suite
class是关键字,bases是要继承的父类,默认继承object类。
class documentation string是类文档字符串,一般用于类的注释说明。class_suite是类体,主要包含属性和方法。
类、属性和方法的命名约定惯例如下:
类名表示实例的抽象,命名时首字母大写;
属性使用名词作为名字,比如name、age、weight等;
方法名一般指对属性的操作,其命名规则一般采用动词加属性名称形式,如updataName、updataAge、updataWeight等。 举例如下:
# 类定义
class People: # 类名
name = "张三" # 属性名
def undate_name(self, name):# 方法名
self.name = name
Python的类分为以下两种: 经典类 新式类
经典类:Python2.x中类定义的默认方式,不继承object类,其内部由属性和方法组成。经典类定义的典型方式如下:
# 经典类是指没有继承object类
class A:
pass
新式类:Python3.x中类定义的默认方式,必须继承object方法,其典型定义方式如下:
# 新式类是指继承object的类
class A(object):
pass
新式类修复了经典类的一些bug(如多重继承时的歧义等),并且提供了对类方法和静态方法的支持。
在Python3.x中,如果没有显示指明要继承的父类,则默认继承object类。
class A:
pass
class A():
pass
class A(object):
pass
Python3.x中,无需继承时,例子中三种类的创建效果一样。自动继承object类。
2. 对象的创建:
类创建完之后,就应该创建该类的实例或对象了,该过程称之为实例化。当一个对象被创建后,就包含标识、属性和方法这三个方面的对象特性了。其中,对象标识用于区分不同的对象,属性和方法与类中的成员变量和成员函数相对应
people = People("李四", 20, "50kg") # 实例化一个对象
如例子所示,对象标识符为people,属性为括号中内容,方法为类中方法
3. 类的属性 :
Python语言中,属性分为类级别和实例级别两种。实例级别的属性值默认共享类级别的属性值。除非显式进行赋值操作。下面举一个例子来说明。
class A():
age = 10
obj2 = A()
obj3 = A()
如例子所示,存在三个实例,分别是类实例A和对象实例obj2、obj3。在情形1中,obj2和obj3这两个对象实例共享类实例A的属性age;
情形1
print(obj2.age, obj3.age, A.age)
情形2: 在情形2中,显示修改了对象实例obj1的属性aaa;
obj2.age+=2 print(obj2.age, obj3.age, A.age)
情形3:在情形3中,修改了类实例A的属性aaa。
A.age+=3 print(obj2.age, obj3.age, A.age)
结果所示:
情景1: 10 10 10 情景2: 12 10 10 情景3: 12 13 13
在情形2中已经修改了对象实例obj2的属性值age,其属性值和类实例A的属性值已经独立。而对象实例obj3的属性从来没有修改过,所以它还是和类实例A的属性值保持一致。
Python语言对于属性的设置采用“类.属性 = 值”或“实例.属性 = 值”的形式。如上例中obj2.age += 2等价于obj2.age = obj2.age + 2,该语句包含了属性获取及属性设置两个操作。
Python语言中的属性操作遵循三个规则:
(1)属性的获取是按照从下到上的顺序来查找属性;
(2)类和实例是两个完全独立的对象;
(3)属性设置是针对实例本身进行的。
类的定义由属性和方法组成,属性是对数据的封装,方法则是对类行为的封装。属性按使用范围分为公有属性和私有属性
python类的成员没有访问控制限制,这与其他面向编程的语言不同。
通常约定以两个下划线开头,但是不以两个下划线结束的属性是私有的,其他为公共的。注意,不能直接访问私有属性,但可以通过方法中访问.
class A:
__name='class A'
def dd(self):
print('私有属性')
sg=A()
sg.dd()
print(sg.__name)
执行出来会报错:
Traceback (most recent call last): File "G:/I like study/1.6.py", line 7, inprint(sg.__name) AttributeError: 'A' object has no attribute '__name' 私有属性
所以不能直接访问私有属性,不然直接报错。但可以在方法中访问:
class A:
__name='class A'
def dd(self):
print(A.__name)
sg=A()
sg.dd()
输出结果:
class A4. 类的方法:
类方法也包括公有方法、私有方法、类方法和静态方法。
类的(公有)方法:
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。
类的私有方法:
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
#问女性的姓名、工作是没有问题的,但是问女性的年龄、体重是不礼貌的,所以我们把女性年龄定义为私有属性
#定义显示女性的姓名、工作为公有方法,显示女性年龄、体重为私有方法
#类的定义部分
class Woman():
name = "Juckes" #类的公有属性
job = "Teacher"
__ages = 30 #类的私有属性
__weight = 60
def disp_nj_info(self): #类的(公有)方法
print("Name:{}, Job:{}".format(self.name,self.job)) #类的内部调用公有属性
def __disp_aw_info(self): #类的私有方法
print("Age:{}, Weight:{}".format(self.__ages, self.__weight)) #类的内部调用私有属性
def dis_all_info(self):
self.disp_nj_info() #类的内部调用公有方法
self.__disp_aw_info() #类的内部调用私有方法
类外使用类的公有属性, True
#主程序部分 womanA = Woman() print(womanA.name, womanA.job)
运行结果:
Juckes Teacher
类外使用类的私有属性, False
#主程序部分 womanA = Woman() print(womanA.__ages, womanA.__weight)
结果:
Traceback (most recent call last): File "D:/untitled2/timer_test.py", line 60, inprint(womanA.__ages, womanA.__weight) AttributeError: 'Woman' object has no attribute '__ages'
类外使用公用方法,True
#主程序部分 womanA = Woman() womanA.disp_nj_info()
结果:
Name:Juckes, Job:Teacher
类外使用类的私有方法, False
#主程序部分 womanA = Woman() womanA.__disp_aw_info()
结果:
Traceback (most recent call last): File "D:/untitled2/timer_test.py", line 60, inwomanA.__disp_aw_info() AttributeError: 'Woman' object has no attribute '__disp_aw_info'
类外通过调用公有方法的方式,间接调用私有方法,True
在这里插入代码片#主程序部分 womanA = Woman() womanA.dis_all_info() #通过调用dis_all_info,间接调用__disp_aw_info
结果:
Name:Juckes, Job:Teacher Age:30, Weight:60
5. 类间关系:
依赖关系 关联关系 继承关系
依赖关系:由于python是一门弱类型编程语言,并且所有的对象之间其实都是多态的关系,也就是说,所有的东西都可以当做对象来使用, 所以我们在写代码的时候很容易形成以上关系.首先,我们先看第一种, 也是这些关系中紧密程度最低的一个, 依赖关系.
class Person():
def play(self, tools):
tools.run()
print("很开心,能玩游戏了")
class Computer():
def run(self):
print("电脑开机,可以运行")
class Phone():
def run(self):
print("手机开机,可以运行")
c = Computer()
phone = Phone()
p = Person()
p.play(phone)
输出:
手机开机,可以运行 很开心,能玩游戏了
例子定义了Person、Computer、Phone三个类,在Person类的play()方法中,可以使用Computer类或Phone类的实例作为参数。因为在Person类方法中实现时需要Phone类实例调用方法完成,所以这两个类之间存在依赖关系。
冰箱的功能非常简单, 只要会开门关门就行了. 但是大象就没那么简单了,想想,大象开门和关门的时候是不是要先找个冰箱啊, 然后呢? 打开冰箱门,是不是打开刚才找到的那个冰箱门, 然后装自己,最后呢? 关冰箱门, 注意, 关的是刚才那个冰箱吧. 也就是说, 开门和关门用的是一个冰箱,并且大象有更换冰箱的权利, 想进哪个冰箱就进哪个冰箱. 这时, 大象类和冰箱类的关系并没有那么的紧密,因为大象可以指定任何一个冰箱. 接下来,我们把代码完善一下.



