python-类的基本使用
类的基本使用(引用小猿圈)
class Dog(): # 类以class开头,类的名字使用驼峰体命名。不加()为经典类,加()为新式类 d_type = "京巴" # 类的成员变量,类属性,类变量(属于每个实例共有的属性) def __init__(self,name,age): # 初始化方法,实例化的时候会自动执行,会进行一些初始化工作 self.name = name # 将name与实例进行绑定,也就变成了私有属性 self.age = age def say_hi(self): # 类方法,第一个参数是self,self代表类实例本身 print("hi,大家好我是一个{}".format(self.d_type)) # d = Dog() # 类的实例化 # d2 = Dog() # 类的实例化 d = Dog("mjj",12) # 类的实例化,实例化带有私有属性,这里的参数会直接传给__init__的方法中,这就是函数中参数的传递了 d2 = Dog(name="ccc",age=18) print(d.name,d.age) print(d2.name,d2.age) print(d.d_type) # 类的实例化调用类属性 print(d2.d_type) # 类的实例化调用类属性 d.say_hi() # 使用类的实例化调用类方法 d2.say_hi() # 使用类的实例化调用类方法 print(id(d.d_type),id(d2.d_type))
类属性:属于公共属性,这个值是存在类的内存空间,(每个实例有自己的内存空间)
print(id(d.d_type),id(d2.d_type))
- 私有属性:存储在初始化方法中,通过self.xxx = xxx将属性与实例进行绑定,因为self代表实例本身的嘛
- 类方法中调用私有属性,使用self.xxx
理解self是实例本身
看我使用d.say_hello(),并没有传递任何的参数,但是没有报错。我们知道函数如果有形参的话,就必须要传递实参与之相对应,是因为python自动给传递了一个参数d.say_hello()相当于d.say_hello(d),为了验证我们在方法里面打印这个self看看与实例d的id是否一样
class Dog(): # 类以class开头,类的名字使用驼峰体命名。不加()为经典类,加()为新式类 d_type = "京巴" # 类的成员变量,类属性,类变量(属于每个实例共有的属性) def __init__(self,name,age): # 初始化方法,实例化的时候会自动执行,会进行一些初始化工作 self.name = name # 将name与实例进行绑定,也就变成了私有属性,把这两个值真正的存在实例里 self.age = age def say_hello(self): print("hello ,大家好,我是{},年龄是{}".format(self.name,self.age)) print("这里是类中say_hello()方法中的self的内存id:{}".format(id(self))) d = Dog("mjj",12) # 类的实例化,实例化带有私有属性,这里的参数会直接传给__init__的方法中,这就是函数中参数的传递了 print("这个是实例化对象d的内存id:{}".format(id(d))) d.say_hello()
-
- 那为什么python要自动给你传self,也就是实例本身呢?
- 是为了要在类中打通私有属性与方法之间的调用,他知道你要用,就给你用
- 在__init__中给你绑定上self,下面的say_hello(),再将self传递过来,这样你就可以使用了
理解类变量和私有属性之间的区别
![image-20200506230926158](/Users/mac/Library/Application Support/typora-user-images/image-20200506230926158.png)
附:代码
# -*- conding:utf-8 -*- # @Time : 2020/5/6 21:49 # @Author : shanshan # @File : 类的基本使用.py class Dog(): # 类以class开头,类的名字使用驼峰体命名。不加()为经典类,加()为新式类 d_type = "京巴" # 类的成员变量,类属性,类变量(属于每个实例共有的属性) def __init__(self, name, age): # 初始化方法,实例化的时候会自动执行,会进行一些初始化工作 self.name = name # 将name与实例进行绑定,也就变成了私有属性,把这两个值真正的存在实例里 self.age = age def say_hi(self): # 类方法,第一个参数是self,self代表类实例本身 print("hi,大家好我是一个{}".format(self.d_type)) def say_hello(self): print("hello ,大家好,我是{},年龄是{}".format(self.name, self.age)) print("这里是类中say_hello()方法中的self的内存id:{}".format(id(self))) # d = Dog() # 类的实例化 # d2 = Dog() # 类的实例化 d = Dog("mjj", 12) # 类的实例化,实例化带有私有属性,这里的参数会直接传给__init__的方法中,这就是函数中参数的传递了 d2 = Dog(name="ccc", age=18) print("这个是实例化对象d的内存id:{}".format(id(d))) d.say_hello() # d2.say_hello() print(d.name, d.age) print(d2.name, d2.age) print(d.d_type) # 类的实例化调用类属性 print(d2.d_type) # 类的实例化调用类属性 d.say_hi() # 使用类的实例化调用类方法 d2.say_hi() # 使用类的实例化调用类方法 print(id(d.d_type), id(d2.d_type))
私有属性:存储在初始化方法中,通过self.xxx = xxx将属性与实例进行绑定,因为self代表实例本身的嘛
![image-20200506224311242](/Users/mac/Library/Application Support/typora-user-images/image-20200506224311242.png)
类方法中调用私有属性,使用self.xxx
? ![image-20200506224731023](/Users/mac/Library/Application Support/typora-user-images/image-20200506224731023.png)
理解self是实例本身
看我使用d.say_hello(),并没有传递任何的参数,但是没有报错。我们知道函数如果有形参的话,就必须要传递实参与之相对应,是因为python自动给传递了一个参数d.say_hello()相当于d.say_hello(d),为了验证我们在方法里面打印这个self看看与实例d的id是否一样
class Dog(): # 类以class开头,类的名字使用驼峰体命名。不加()为经典类,加()为新式类 d_type = "京巴" # 类的成员变量,类属性,类变量(属于每个实例共有的属性) def __init__(self,name,age): # 初始化方法,实例化的时候会自动执行,会进行一些初始化工作 self.name = name # 将name与实例进行绑定,也就变成了私有属性,把这两个值真正的存在实例里 self.age = age def say_hello(self): print("hello ,大家好,我是{},年龄是{}".format(self.name,self.age)) print("这里是类中say_hello()方法中的self的内存id:{}".format(id(self))) d = Dog("mjj",12) # 类的实例化,实例化带有私有属性,这里的参数会直接传给__init__的方法中,这就是函数中参数的传递了 print("这个是实例化对象d的内存id:{}".format(id(d))) d.say_hello()
![image-20200506225922460](/Users/mac/Library/Application Support/typora-user-images/image-20200506225922460.png)
那为什么python要自动给你传self,也就是实例本身呢?
- 是为了要在类中打通私有属性与方法之间的调用,他知道你要用,就给你用
- 在__init__中给你绑定上self,下面的say_hello(),再将self传递过来,这样你就可以使用了
理解类变量和私有属性之间的区别
附:代码
class Dog(): # 类以class开头,类的名字使用驼峰体命名。不加()为经典类,加()为新式类 d_type = "京巴" # 类的成员变量,类属性,类变量(属于每个实例共有的属性) def __init__(self, name, age): # 初始化方法,实例化的时候会自动执行,会进行一些初始化工作 self.name = name # 将name与实例进行绑定,也就变成了私有属性,把这两个值真正的存在实例里 self.age = age def say_hi(self): # 类方法,第一个参数是self,self代表类实例本身 print("hi,大家好我是一个{}".format(self.d_type)) def say_hello(self): print("hello ,大家好,我是{},年龄是{}".format(self.name, self.age)) print("这里是类中say_hello()方法中的self的内存id:{}".format(id(self))) # d = Dog() # 类的实例化 # d2 = Dog() # 类的实例化 d = Dog("mjj", 12) # 类的实例化,实例化带有私有属性,这里的参数会直接传给__init__的方法中,这就是函数中参数的传递了 d2 = Dog(name="ccc", age=18) print("这个是实例化对象d的内存id:{}".format(id(d))) d.say_hello() # d2.say_hello() print(d.name, d.age) print(d2.name, d2.age) print(d.d_type) # 类的实例化调用类属性 print(d2.d_type) # 类的实例化调用类属性 d.say_hi() # 使用类的实例化调用类方法 d2.say_hi() # 使用类的实例化调用类方法 print(id(d.d_type), id(d2.d_type))