简单理解python中的类

一.属性:

1:实例属性:

在__init__方法(self,…)内初始化的属性

内部调用时都需要加上self.

外部调用时用实例化对象.属性名

class people:
    name="John"
 
p=people()
p.age=18
 
print(p.name)
print(p.age)    #实例属性是实例对象特有的,类对象不能拥有
 
print(people.name)
#print(people.age)  #错误:实例属性,不能通过类对象调用

 将实例属性放在构造方法中:

class people:
    name="tom"
    def  __init__(self,age):
        self.age=age
 
p=people(18)
 
print(p.name)
print(p.age)    #实例属性是实例对象特有的,类对象不能拥有

print(people.name)
# print(people.age)  #错误:实例属性,不能通过类对象调用
 

 

2:类属性:

在__init__()方法外初始化的属性

在内部用类名.类属性名调用

外部既可以用类名.类属性名又可以用实例化对象.类属性名来调用

# 类属性
class people:
    name="Tom"    #公有的类属性
    __age=18      #私有的类属性
 
p=people()
print(p.name)   # 通过实例对象访问类属性
print(people.name)  # 通过类对象访问
 
# print(p.__age)    #错误 不能在类外通过实例对象访问私有的类属性
print(people.__age) #错误 不能在类外同过类对象访问私有的类属性

类属性与实例属性:

class people:
    name="tom"      #类属性:实例对象和类对象可以同时调用
    def  __init__(self,age):    #实例属性
        self.age=age
 
p=people(18)    #实例对象
p.sex="男"       #实例属性
 
print(p.name)
print(p.age)    #实例属性是实例对象特有的,类对象不能拥有
print(p.sex)
 
print(people.name)  #类对象
# print(people.age)  #错误:实例属性,不能通过类对象调用
# print(people.sex)  #错误:实例属性,不能通过类对象调用

2.1 在类外修改属性

# 如果在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性(实则是在对象中添加了一个实例属性),并不会影响到类属性,并且如果通过实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性,若删除了该实例属性,屏蔽掉的类属性会重新显示打印出来。

  1 class Animal:
  2     name = "ant"
  3 
  4 
  5 # 如果在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用>    ,
  6 # 会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且如果>    通过
  7 # 实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非>    删除了该实例属性
  8 
  9 
 10 print(Animal.name)  # an t使用类对象引用类属性
 11 p =Animal()
 12 print(p.name)     # ant 使用实例对象引用类属性
 13 p.name = "cat"    # 使用实例对象修改类属性,实则是在对象里添加了一个实例属性
 14 print(p.name)     # cat
 15 print(Animal.name) # ant 类属性
 16 
 17 # 删除实例属性
 18 del p.name      # 使用实例对象删除的是实例属性
 19 print(p.name)
class Test:
 
    num=100 #类属性
    def __init__(self):
        self.age=18     #实例属性
 
test1=Test()
test2=Test()
# test1.age=19
# test2.age=20
print(test1.num)    #100
test1.num=200       #如果通过对象去修改类属性,那么Python会自动给这个对象和这个类属性相同名字的实例属性
print(test1.num)    #200,只是修改了副本
print(Test.num)     #100
 
del test1.num        #删除之后,仍能打印
print(test1.num)

2.2、类方法

是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。

  1 class People
  2     country = "China"
  3 
  4     # 定义一个类方法
  5     @classmethod  #修饰器@classmethod用来表示为类方法
  6     def getCountry(cls):
  7         return cls.country
  8 
  9 
 10 person = People()
 11 print(person.getCountry()) #使用实例对象调用类方法
 12 print(People.getCountry()) #类对象调用类方法

 

3:私有属性:

1):单下划线_开头:只是告诉别人这是私有属性,外部依然可以访问更改

2):双下划线__开头:外部不可通过实例化对象.属性名来访问或者更改 
    
实际将其转化为了_类名_属性名,只是在内部将变量名修改了,我们仍让可以通过._类名_属性名访问

class Test(object):
    #类属性
    a = 100
    def __init__(self, b):
        #实例属性
        self.b = b
t = Test(100)

#通过实例化对象访问 类属性

print("t.a = %d"%t.a)

#通过类名访问 类属性

print("Test.a = %d"%Test.a)

#通过实例化对象访问 实例属性

print("t.b = %d"%t.b)

#通过类名访问 实例属性

print("Test.b = %d"Test.b) #error 无法通过(类名.属性名)的方式访问实例属性

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值