对象是类的实例
类是描述一类物体,是一个概括性的东西 对象: 指的是从类实例化过来的一个具体的物体 举例: 空调: 描述的是所有的空调(不知道是哪一个空调) ???? 能效等级, 立式的还是挂式的,匹数, 大小, 位置,编号 指定空调的属性:我家的位置,哪个房间, 20*300*200, 挂式的, 1 就知道这是一个具体的空调
目录
1.1类的定义? ? ??
1.1.1定义一个Dog的类
小总结
1.1.2私有方法
?1.1.3静态方法和类方法
1.1类的定义? ? ??
????????数据和功能绑定在一起: 类中有变量有函数。
如何去定义一个类:
语法格式:
ClassName: 类名,尽量使用驼峰命名 ?????????? 单词首字母大写 class ClassName: ??? varibale_name = value ??? ..... ??? def func(self, arg) ??????? statement
在python中规定:类中的函数,必须携带self参数 => 新的名字叫做方法 self: 自己 -> 指向的就是他的调用者
class Person:
name = "zhangsan" # 类变量
age = 18 # 类变量
gender = "男" # 类变量
def test_fun(self): # test_func = method obj #创建一个方法
print("This is a method")
#类的实例化
zhangsan = Person() #创建对象
lisi = Person() #创建对象
#属性和方法的调用
print(zhangsan.name)
print(lisi.name)
zhangsan.test_fun()
?输出:
?????????
问题:按道理张三应该zhangsan,lisi应该也有自己的名字李四 ? ? ? ? ? ?实例化出来两个对象: zhangsan和lisi ? ? ? ? ? ?name是一样的: 是因为是类变量
问题:可不可以有对象变量? 可以的
???????????如何去定义对象变量 ? ? ? ? ? ?在初始化的时候定义对象变量
定义了一个类, => 从类实例化一个对象 AirCondition => myac 实例化一个对象的时候做了什么? ? ? ?创建一个新的对象(开创空间) (参与不了) ? ? ?初始化这个对象 (可以参与) ? ? ?这两个操作是Python解释器帮我们做的
1.1.1定义一个Dog的类
#定义一个Dog类
class Dog(): #定义一个小狗的类 注意:首字母大写的名称值得是类
"""一次模拟狗的简单测试"""
#初始化的方法(也叫构造方法): python解释器已经规定好了
def __init__(self, name, age): #带参构造
self.name = name #对象变量
self.age = age #对象变量
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name + "马上坐下")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name + "打滚")
dog1 = Dog("旺财", 2) #创建对象
print(dog1.name)
dog1.sit() #调用方法
dog1.roll_over()
输出:
?????????方法__init__()
? ? ? ? 类中的函数称之为方法,方法__init__()是一个特殊的方法,每当你根据Dog类去创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和结尾各有两个下划线,这是一种约定,避免Python默认方法与普通方法发声明称冲突。?__init__()方法定义时,形参self必不可少,还必须位于其他形参的前面。
小总结
定义一个类, 需要通过类来实例化具体的对象 类是组织数据和功能的: ?? 数据:类变量,对象变量 ?? 功能: 方法 ?? 类变量: 定义在类中,方法外的变量: variable_name = value ????????? 在加载类定义的时候,直接加载 ????????? 意味着从这个类实例化出的所有对象都具有这个类变量 ????????? 实例变量用于每个实例的唯一数据,而类变量用于类的所有实例共享的属性和方法\ ????????? 对象变量中找不到的属性,会去类变量中找 ?? 对象变量: 定义在类中的__init__(初始化方法内的) ?????????? 对象变量都是这种形式: self.variable_name = value ????????? 每次实例化的时候都会调用这个方法__init__(python中的规定) ????????? 所以每个对象具有自己的变量(类变量),有自己独立的空间 ????????? 可以通过初始化方法来初始化对象不同值的属性
????????? 可以去定义对象的临时变量: 对象.temp_var = value ????????????? 只存在于当前这个对象
?? 方法: 和定义函数一样,不一样的地方在于: ? ? ? ? ? ? ? 1.方法是在类中定义的 ? ? ? ? ? ? ? 2.方法的第一个参数是self(指向的是对象本身) 实例化:list_data = list() ?????? 对象 = 类(初始化的参数) ?????? 注意:初始化的参数主要是传递给__init__(初始化参数) ?????? 实例化其实有两个动作: python解释器帮我们完成的(帮我们去调用) ?????????? 1. 创建一个类的对象(开创空间) __new__ ?????????? 2. 根据创建的对象进行初始化? __init__ ?????????? 所以不需要显示去调用
实例化之后就可以拿到对象了,我们要干什么? 操作属性 操作类属性(类变量) ?? 只是去访问: 类.类变量和对象.类变量 ?? 去修改: 类.类变量 = value? ? ?????????? ????????注意:如果是这样的修改: 对象.类变量名 = value ????????????????? ????????????其实就是定义了一个对象的临时变量-> 和类变量同名的变量 ????????????????? ????????????而不是修改类变量的值 操作对象属性 ?? 访问: 对象.变量名 ?? 修改:? 对象.变量名 = value 操作方法 调用方法: 对象.方法名(参数)
1.1.2私有方法
? ? ? ? 在Python程序中,函数、类方法或属性的名字以两天下划线“__”开始的,(注意,这不是结束),那么这个函数、方法或属性就是私有的,其他所有的方法都是公开的。当在类的内部调用私有成员时,可以用点“.”运算符实现。语法格式如下:
? ? ? ? self.__方法名
私有函数、方法和属性的特点:
- 私有函数不可以从它们的模块外部调用
- 私有类方法不能够从它们的外面调用
- 私有属性不能够从他的类的外面访问
? ? ? ? 私有方法的举例:
class Site():
def __init__(self, name, age): #构造方法
self.name = name #共有属性
self.__age = age #私有属性
def who(self):
print("姓名:", self.name)
print("年龄:", self.__age)
def __foo(self): #定义私有方法
print("这是私有方法")
def foo(self): #定义公有方法
print("这是共有方法")
self.__foo()
text = Site("大黄", 2) #创建对象
text.who()
text.foo()
#text.__foo()
? ? ? ? 在上述实例代码中定义了私有方法__foo(),在类中可以使用它。在最后一行代码中,要尝试在外部调用私有方法__foo(),在这个Python中是不允许的。?
执行效果:
?
?1.1.3静态方法和类方法
? ? ? ? 类方法:隐含调用参数的类。在定义类方法时,因该使用装饰器@classmethod进行修饰,并且必须有默认参数“cls”.
? ? ? ? 静态方法:没有隐含调用参数。在定义静态方法时,应该使用修饰符@staticmethod进行修饰,并且没有默认参数。
????????实例代码:
class Jing():
@staticmethod
def static_method(): #静态方法装饰器
print("此处调用了静态方法") #定义静态方法
@classmethod #使用类方法装饰器
def class_method(cls): #定义类方法
print("此处调用了类方法")
#没有实例化类,通过类名调用静态方法
Jing().static_method()
#没有实例化类,使用类名调用类方法
Jing().class_method()
dm = Jing() #实例化类
dm.class_method() #通过对象调用类方法
dm.static_method() #通过对象调用静态方法
? ? ? ? 执行效果:
1.1.4类的专有方法(魔法方法)
? ? ? ? 格式:__xxx__():这些方法是Python解释器一斤规定好的。?自己定义方法时不能以这种格式。
????????
? ? ? ? __init__:? ? ? ? ????????构造方法,在生成对象时调用
? ? ? ? __del__:? ? ? ? ????????析构方法,在释放对象时调用
? ? ? ? __repr__:? ? ? ? ????????打印,转换
? ? ? ? __setitem__ :????????按照索引赋值 ? ? ? ? __getitem__:????????按照索引获取值
? ? ? ? __len__:? ? ? ? ????????获得长度 ? ? ? ? __cmp__:? ? ? ????????? 比较运算
? ? ? ? __call__:? ? ? ? ????????函数调用
? ? ? ? __add__:? ? ? ? ????????加运算 ? ? ? ? __sub__:? ? ? ????????? 减运算
? ? ? ? __mul__:? ? ? ????????? 乘运算 ? ? ? ? __div__:? ? ? ????????? 除运算
????????__mod__:? ? ? ????????? 求余运算
? ? ? ? __pow__:? ? ? ????????? 乘方
? ? ? ? __eq__:? ? ? ? ? ? ? ? 比较
? ? ? ? __ne__:? ? ? ? ? ? ? ? no equal
? ? ? ? __str__:? ? ? ? ? ? ? ? ?人类可读
? ? ? ? ?如果你定义了一个类,而且想让这个类的对象执行某些操作的时候(根据你的规则来执行),那么就需要重写这些魔法方法(专有方法)。
????????
|