首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python类对象属性

python类对象属性
EN

Stack Overflow用户
提问于 2018-09-17 04:53:52
回答 3查看 418关注 0票数 0

面向对象编程对我来说是非常新的。我只是想学一点关于类和方法的知识。我正在尝试编写一个名为'Object‘的简单类,然后定义一些几何对象,例如圆、矩形等。然后,我想要拥有诸如' area’和‘class’这样的属性,在这些属性中,我想要访问圆的面积,如下所示:

代码语言:javascript
复制
class object:
       import numpy as np
       pi = np.pi

       def circle(self):
          def area(self, radius):
             self.area=self.radius**2 * self.pi


s = object()
print(s.__dict__)
print(s.circle.area(5))

在运行时,我得到了:

代码语言:javascript
复制
{}
Traceback (most recent call last):
  File "/Users/aya/Desktop/test.py", line 12, in <module>
    print(s.circle.area(5))
AttributeError: 'function' object has no attribute 'area'

如何让s.circle.area(5)工作?

EN

回答 3

Stack Overflow用户

发布于 2018-09-17 05:13:55

1)名称object已被用作基本的Python对象,您应该使用另一个名称(Polygon?)

2)我想你的意思是让circle成为一个新的类,而不是一个函数。您可以通过在类声明中包含一个类来使它类似于另一个类,或者“继承”另一个类:

代码语言:javascript
复制
class Circle (Polygon): #NOT object, see number one 
    def __init__ (self, radius): #called to make a new Circle
        self.radius = radius #give this circle its radius
    def area (self): 
        # self.pi is already declared because Polygon states it, and Circles "inherit" that trait 
        return self.pi * (self.radius ** 2)

现在,做一个圆圈:

代码语言:javascript
复制
circle = Circle (5) # or Circle (radius = 5)
pi = circle.pi 
# or Circle.pi, since it belongs to the whole class (upper-case) and not just the object (lower-case)
area = circle.area() #needs to be on a specific circle, because radii can vary
票数 0
EN

Stack Overflow用户

发布于 2018-09-17 05:15:57

下面是一个对你有帮助的例子

代码语言:javascript
复制
class Dog:

    # Class Attribute
    species = 'mammal'

    # Initializer / Instance Attributes
    def __init__(self, name, age):
        self.name = name
        self.age = age


# Instantiate the Dog object
philo = Dog("Philo", 5)
mikey = Dog("Mikey", 6)

# Access the instance attributes
print("{} is {} and {} is {}.".format(
    philo.name, philo.age, mikey.name, mikey.age))

# Is Philo a mammal?
if philo.species == "mammal":
    print("{0} is a {1}!".format(philo.name, philo.species))

当我运行上面的文件时,我得到了。

代码语言:javascript
复制
Philo is 5 and Mikey is 6.
Philo is a mammal!

内部类示例

代码语言:javascript
复制
#!/usr/bin/env python

class Human:

  def __init__(self):
    self.name = 'Guido'
    self.head = self.Head()
    self.brain = self.Brain()

  class Head:
    def talk(self):
      return 'talking...'

  class Brain:
    def think(self):
      return 'thinking...'

if __name__ == '__main__':
  guido = Human()
  print guido.name
  print guido.head.talk()
  print guido.brain.think()
票数 0
EN

Stack Overflow用户

发布于 2018-09-17 05:41:49

对我来说,一切都不新鲜,但您在这里尝试做的是什么?s.circle.area(5)正在访问Object的属性,object也应该是一个对象,因为您试图调用此特定属性的方法。

在clear中,‘’允许您仅访问属性或函数。举个例子

代码语言:javascript
复制
class Square:
    def __init__(self, size):
        self.size = size

    def resize(self, new_size):
        self.size = new_size

#Usage
>>> form = Square(5)
>>> print(form.size)
>>> 5 #output
>>> form.resize(120)
>>> print(form.size)
>>> 120 #output

在你的代码中,它真的很奇怪,没有任何意义,很多混乱。您正在定义一个函数圆内的函数区域,该函数尝试使用具有现有属性pi的现有self.radius对象来创建区域属性。

想象一下这样的东西可以工作,你试图通过调用circle的方法来访问函数的函数(没有意义,很难解释)。

还是在我们的正方形中,您可以访问一个属性:

代码语言:javascript
复制
>>> form.size

现在,您尝试从其中调用一个函数:

代码语言:javascript
复制
>>> form.size.action()

在本例中,您使用的是一个整数方法(int也是包含方法的类)

通过调用对象方法:

代码语言:javascript
复制
>>> form.reshape(8) #changing the current size
>>> form.reshape(8).action()

它以这种方式在重塑的函数返回上调用一个方法。似乎你对函数定义并不是很有信心(两个def关键字紧跟在一起,这是可能的,但不确定这是你的目标),import我不确定它的选择是否真的明智(numpy将在每次对象创建时导入,对你来说是有用的吗?)。注意基础,你的基础越强,你就越能理解你在做什么,在编程中,你必须知道你在做什么。

如何使s.circle.area(5)工作?

至少,你可以这样做

代码语言:javascript
复制
import numpy

class Circle:
    def __init__(self, area = 0):
        self.area = area
    def area(self, new_area):
        self.area = new_area
        return self.area


 class Object:
     pi = numpy.pi
     circle = Circle()

 >>> obj = Object()
 >>> obj.circle.area(5)

我终于可以做这个动作了!许多事情都不是好的实践,或者如果不明智地使用它就不会有期望的行为,你必须理解发生了什么。我知道这是你正在学习的,这真的很好,但是如果不知道怎么走就不要跑(而且不是真的很快)。(我可能有点太抱歉了,这是给你的,小心点)

附言:我在这里谈到的每一件事都有大量的文档。类定义实际上是Python中的标准。在不创建对象的情况下进行面向对象编程,这可能是自相矛盾的。这里有一些文档:https://docs.python.org/3.7/tutorial/classes.html#a-first-look-at-classes

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52358290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档