1. 类的组成
class Demo():
var = 'demo' # 类属性,公有
__num = 100 # 类属性,私有
def __init__(self,name='muzi',age=18):
self.name = name # 实例属性,公有
self.__age = age # 实例属性,私有
print('demo构造方法,特殊方法,私有')
print('内置属性,获取类名:',Demo.__name__) #内置属性,自带
def fun1(self):
print('fun1实例方法,公有')
def __fun2(self):
print('fun2实例方法,私有')
@classmethod
def class_fun(cls):
print('class_fun类方法,装饰器@classmethod')
@staticmethod
def static_fun():
print('static_fun静态方法,装饰器@staticmethod')
@property
def prop(self):
print('prop属性方法,装饰器@property')
print('类的所有属性与方法:',Demo.__dict__)
d = Demo()
print('对象的所有属性:',d.__dict__)
print('打印出类名:',Demo.__name__)
2. 类的属性
1-类属性:
位置:声明在类中,函数外面的
查看属性值:
类名.属性名 --推荐
对象名.属性名 --很少用
修改属性值:
类名.属性名 = 新值 --推荐
对象名.属性名 = 新值 --很少用
总结:对象名.属性名方式修改属性值后,只有此对象访问的属性是修改后的值,其他对象访问时还是原来的值
总结:类名.属性名方式修改属性值后,无论某个对象访问的该属性,都是修改后的值
class Demo():
var = 'var_demo' # 类属性,公有
__num = 100 # 类属性,私有---私有的只能在本类中使用
def test(self):
print('test')
def p_var(self):
# Demo.var = '1233'
print(Demo.var) #类名.属性名
def p_num(self):
print(Demo.__num) #类名.属性名
'''1.1 查看类属性值:
类名.属性名
'''
# 1-查看公有/私有类属性
#1.1 类外面使用类属性
print(Demo.var)
# print(Demo.__num) #AttributeError: type object 'Demo' has no attribute '__num'
# 1.2 类里面使用类属性
d = Demo()
d.p_num()
d.p_var()
总结:私有类属性只能在本类使用,出了本类就不可以用,公有类属性在哪都可以用
1.2 修改类属性值:
类名.属性名 = 新值
2-修改公有/私有类属性
2.1 类外面修改类属性
Demo.var = 'test_var'
print(Demo.var)
# 私有属性,是不可以在类外面去修改
Demo.__num = 500
print(Demo.__num) # 并没有真正修改私有类属性的值,而是Demo.__num当成了一个变量
# 判断Demo.__num是否真正的修改
d = Demo()
d.p_num() # 500==成功 100==失败
zs = Demo()
ls = Demo()
print(zs.var)
print(ls.var)
总结:类名.属性名方式修改属性后,无论某个对象访问的该属性,都是修改后的值
3. 类的实例属性
位置:声明在类中的构造方法里面的
调用属性值:
self.属性名 --在类里面用的时候
对象名.属性名 --在类外面用的时候
修改属性值:
self.属性名 = 新值 --在类里面用的时候
对象名.属性名 = 新值 --在类外面用的时候
class Demo():
var = 'demo' # 类属性,公有
__num = 100 # 类属性,私有
def __init__(self,mname='muzi',mage=18):
self.name = mname # 实例属性,公有
self.__age = mage # 实例属性,私有
print('demo构造方法,特殊方法,私有')
def info(self):
self.name = 'test_demo'
print('姓名:{},年龄:{}'.format(self.name,self.__age))
'''2-1 查看实例属性值
# 对象.属性名
# self.属性名 --本类中使用'''
# 2.1.1 类外面使用实例属性
muzi = Demo()
# print('姓名:{}'.format(muzi.name))
# # print('年龄:{}'.format(muzi.__age)) #AttributeError: 'Demo' object has no attribute '__age'
zs = Demo('zs','18')
# print('姓名:{}'.format(zs.name)) # zs
#
# ls = Demo('ls',20)
# print('姓名:{}'.format(ls.name)) # ls
# 2.1.2 类里面使用实例属性
zs.info()
muzi.info()
''' 2-2 修改实例属性值
# 对象.属性名 = 新值
# self.属性名 = 新值 --本类中使用'''
# 2.2.1 类外面修改实例属性
muzi = Demo()
muzi.name = 'test_muzi'
muzi.info()
zs = Demo('zs',18)
zs.info() #姓名:zs,年龄:18
4. 内置属性
内置属性:python自定义的一些属性,通过调用来获取对应类的相关属性信息。常见的有:
[类名].__dict__:打印类的所有属性与方法(包括继承自基类的属性和方法)(包括内置属性和方法)
[对象].__dict__:打印对象的所有属性(私有和公有)
[类名].__name__: 打印出类名
class Demo():
var = 'demo' # 类属性,公有
__num = 100 # 类属性,私有
def __init__(self,name='muzi',age=18):
self.name = name # 实例属性,公有
self.__age = age # 实例属性,私有
print('demo构造方法,特殊方法,私有')
print('内置属性,获取类名:',Demo.__name__) #内置属性,自带
def fun1(self):
print('fun1实例方法,公有')
def __fun2(self):
print('fun2实例方法,私有')
print(Demo.__dict__)
5. 实例方法
跟普通方法基本一致,默认第一个参数为self,self 代表的是实例对象,且只能被实例对象调用。
语法:
self.实例方法名() --在类里面用的时候
对象名.实例方法名() --在类外面用的时候
# class Demo():
# var = 'var_demo' # 类属性,公有
# __num = 100 # 类属性,私有---私有的只能在本类中使用
#
# def test(self): # 公有实例方法
# # 实例方法的变量
# self.num = 1
# print('test')
#
# def p_getnum(self):
# print(self.num) # 能=1 不能=2
#
# def __p_var(self,num=1):# 私有实例方法
# print(Demo.var,num) #类名.属性名
#
# def p_num(self):
# self.__p_var(111)
# print(Demo.__num) #类名.属性名
#
# # 1.类外面调用实例方法
# d = Demo()
# d.test()
# # d.__p_var() #AttributeError: 'Demo' object has no attribute '__p_var'
#
#
# # 2.类里面调用实例方法
# print(11)
# d.p_num() #var_demo 111 100
# print(222)
class Demo():
var = 'var_demo' # 类属性,公有
__num = 100 # 类属性,私有---私有的只能在本类中使用
def test(self): # 公有实例方法
# 实例方法的变量
self.num = 1
print('test')
def p_getnum(self):
print(self.num)
def __p_var(self, num=1): # 私有实例方法
print(Demo.var, num) # 类名.属性名
def p_num(self):
self.__p_var(111)
print(Demo.__num) # 类名.属性名
# 3.实例方法中的变量跨方法能否进行调用呢
t = Demo()
t.p_getnum() #AttributeError: 'Demo' object has no attribute 'num'
# 总结:实例方法中定义的变量只能在本实例方法中使用,一旦出了本实例方法,则无法使用,
# 因为实例方法中的变量的作用域只有在本实例中